TFRecord

개요

  1. TFRecord 파일은 텐서플로의 표준 데이터 파일 포맷 (본질적으로 Protocol Buffer 파일)

  2. TFRecord 파일은 데이터를 시퀀셜하게 저장

    • 랜덤 억세스에 적합하지 않음
    • 대용량 데이터를 스트리밍 하는 데 적합
  3. 파일 하나에 모든 dataset과 label을 묶어 놓으면 파일 처리 시간이 단축됨 (권장!)

 

TFRecord 파일 구조

  1. TFRecord 파일은 record 들의 반복

  2. TFRecords > examples > features 형태로 구성

 

TF Input Pipeline

개요

  1. TF Computation-graph에 데이터를 공급하는 방법들 중 하나

    • TF 프로그램에 데이터를 공급하는 방법 3가지

      • feeding
        . 매 스텝을 실행할 때 마다 python 코드가 데이터를 공급

          with tf.Session():
            input = tf.placeholder(tf.float32)
            classifier = ...
            classifier.eval(feed_dict={input: my_python_fn()}))
        

        . 연산 과정에서 TF 그래프와 Python 사이의 context switch 필요 ==> 성능저하

      • input pipeline
        . TF 그래프 첫머리의 input pipeline이 데이터를 가져옴 ==> 추천!

      • preloaded data
        . TF 그래프의 variable이나 constant에 데이터를 미리 적재
        ==> dataset 이 작을 때만 가능

  2. TF Input Pipeline은 모든 포맷의 파일을 사용 가능하나, TFRecord 포맷의 파일 사용을 추천

  3. TF Input Pipeline이 하는 일

    • 파일 목록 가져오기
    • 파일 목록 섞기 (옵션)
    • 파일 큐 생성하기
    • 데이터 읽기, 데이터 디코딩 하기
  4. 이후 소개하는 "Queue based Input Pipeline"은 "Dataset API based Input Pipeline"으로 깔끔하게 대체 가능

    • 하지만, Dataset API는 TF 1.4+에서만 사용 가능
    • TF 1.4는 2017-11-03 출시 (약 1달전), 아직 샘플 코드가 부족함

 

TF Input Pipeline의 전형적인 구성
(TFRecord 파일 읽기 프로세스)


Queue based Input Pipeline 동작양식

  1. Filename Queue 생성

    • Filename 목록으로 Queue 생성 (파일이 1개라도 OK)
    • tf.train.string_input_producer() 함수 이용
      . filename 목록 shuffle 옵션 제공
      . filename queue 반복횟수(epoch) 설정 옵션 제공
    • string_input_producer() 함수는 TF 그래프에 QueueRunner 객체를 추가함
    • string_input_producer() 함수가 추가하는 QueueRunner는 filename queue를 구동하는 역할을 하며 Computation-graph 연산을 구동하는 QueueRunner와 별도의 스레드에서 실행되어 서로 블록되지 않는다
  2. Reader, Decoder 정의 (또는 선택)

    • 파일 포맷 별로 적절한 Reder를 선택하고 적절한 Decoder를 정의/선택해야 함
    • 파일 포맷 별로 다양한 Reader 와 Decoder 제공

      • CSV 파일
        . Reader: tf.TextLineReader
        . Decoder: tf.decode_csv()
      • Fixed Length Record 파일
        . Reader: tf.FixedLengthRecordReader
        . Decoder: tf.decode_raw()
        . 각 record 가 고정된 길이인 파일을 읽을 때
      • TF 표준 파일 (즉, TFRecord 파일) ==> TF 권장 포맷
        . Reader: tf.TFRecordReader
        . Decoder: tf.parse_single_example()
        . 어떤 데이터이든 TFRecord 파일로 변환해서 사용할 것을 권장
  3. Preprocessing (optional, 뭐라도 처리할 일이 있으면 실행)

  4. Example Queue 생성/구동

    • pipeline 마지막 단계에서 학습/평가/추론에 batch 데이터를 공급하는 별도의 큐를 생성/운영
    • tf.train.shuffle_batch() 함수를 이용
      . example들의 순서 난수화 가능
      . batch size 설정 옵션 제공
    • suffle_batch() 함수는 TF Computation-graph에 QueueRunner 객체를 추가함 이 때문에 학습/추론 등을 시작할 때 tf.train.start_queue_runners()를 호출해서 input pipeline을 구동하는 스래드를 생성/실행시켜야 함.
      또, 학습/추론 등이 끝날 때에는 tf.train.Coordinator 를 이용해서 관련 스래드를 모두 종료시켜야 함.

 

TFRecord 파일 저장 프로세스

  1. TFRecord 파일 오픈

    • tf.python_io.TFRecordWriter
  2. 데이터를 적절한 타입으로 변환

    • TFRecord 파일에 저장 가능한 feature 타입의 종류

      • tf.train.Int64List
      • tf.train.BytesList
      • tf.train.FloatList
  3. feature 생성

    • tf.train.Feature
  4. example 생성

    • tf.train.Example
  5. example을 시리얼라이즈

    • example.SerializeToString()
  6. 시리얼라이즈한 example을 TFRecord 파일에 기록

    • writer.write

 

Ref.


Posted by ingeeC
,

구글 프로토콜 버퍼 (Protocol Buffer)

 

개요

  1. <프토토콜 버퍼>는 랭귀지 중립적, 플랫폼 중립적인 데이터 시리얼라이즈 포맷

    • 서로 다른 종류의 머신, 서로 다른 종류의 플랫폼에서 동일한 의미를 갖도록 데이터의 포맷을 정의한다는 점에서 <프로토콜 버퍼>라는 이름은 (구글의 저질 작명 센스를 고려할 때, 의외로) 적절
      --> 프로토콜(통신)을 위한 버퍼(데이터)
  2. <프로토콜 버퍼>는 이제 구글의 데이터 공용어 (gRPC의 디폴트 데이터 포맷)

    • What is gRPC?
      . 구글이 정의한 RPC
      . 구글의 최신 API는 이제 REST API 뿐 아니라 gRPC API도 함께 제공함
      . gRPC는 <프로토콜 버퍼>를 기본 데이터 시리얼라이즈 포맷으로 사용
        (but, JSON 등 다른 포맷도 사용 가능)
      . 다양한 랭귀지 지원: C++, Java, Python, Go, Ruby, C#, Node.js, PHP, ...
  3. JSON을 <프로토콜 버퍼>로 <프로토콜 버퍼>를 JSON으로 변환 가능

  4. XML보다 작고, 빠르고, 간단

 

XML 대비 <프로토콜 버퍼>의 장단점

  1. XML 대비 장점

    • 더 간단함
    • 더 작음: 3배~10배
    • 더 빠름: 20~100배
    • 더 명료함
    • 컴파일러 등 도구를 제공함
  2. XML 대비 단점

    • 본질적으로 바이너리 포맷
      . HTML과의 호환성이 약함
      . human readable 특성이 약함
    • 데이터 포맷을 완전히 파악하려면 .proto 파일이 필요
      . XML은 어느 정도는 자기 완결성을 가짐

 

proto 파일

  1. <프로토콜 버퍼>의 데이터 포맷을 정의하는 소스파일

  2. proto 파일 고유의 문법 존재

  3. proto 파일 안에서 다른 proto 파일 참조 가능

  4. proto 파일을 컴파일하면 각 랭귀지별 라이브러리가 생성됨

    • 지원 랭귀지
      . proto2: C++, Java, Python, Go
      . proto3: C++, Java, Python, Go, Ruby, Objective-C, C#, JavaScript

 

Ref.


Posted by ingeeC
,

에일리언웨어(Alienware) 노트북에서 GPU를 이용, 텐서플로우(TensorFlow) 실행하기



알파고 때문에 어디선가 누군가 나와 같은 삽질을 하고 있을지도 모르겠다. 누구에게라도, 다만 한 삽이라도, 도움이 되기를 바래본다.

+ 우분투 16.04 설치:
  - USB로 우분투 설치후 부팅 => WiFi 안잡힘
  - alienware WiFi 활성화
    . $ sudo service network-manager restart 실행
    . $ cd /lib/firmware/ath10k/QCA6174/hw3.0/ && sudo wget https://github.com/kvalo/ath10k-firmware/raw/master/QCA6174/hw3.0/board-2.bin
    ...리부트...
    . WiFi AP 설정
    * 참고 :  http://askubuntu.com/questions/765838/cannot-enable-wifi-of-alienware-r2-on-ubuntu-16-04-lts
  - gpu 존재 확인
    $ lspci
   
+ NVIDIA driver & CUDA 설치
  ! CMOS 설정에서 Secure Boot 해제 (즉, disable로 설정) ==> 정말 중요!!!
  - Install the NVidia 367.35 Driver
    $] sudo add-apt-repository ppa:graphics-drivers/ppa
    $] sudo apt-get update
    $] sudo apt-get install nvidia-367
    ...리부트...
  - Download the CUDA SDK from NVidia
    . https://developer.nvidia.com/cuda-toolkit
    . cuda_8.0.61_375.26_linux.run 파일 다운로드
  - Install the CUDA SDK
    $] cd ~/Downloads
    $] sudo chmod +x cuda_8.0.27*
    $] sudo ./cuda_8.0.61_375.26_linux.run --override
    $] cd /usr/local/cuda/samples
    $] sudo make
    $] 1_Utilities/deviceQuery/deviceQuery
    $] cd ~ 
  * 참고 : https://github.com/ftlml/user-guides/wiki/Installing-TensorFlow-w-GPU-Support-on-Ubuntu-16.04-for-Pascal-architecture

+ TensorFlow 설치
  ! Python 2.7 또는 Python 3.3+ 필요 (2.7 기준으로 요약)
  - pip 설치
    $ sudo apt-get install python-pip python-dev
  - TensorFlow 설치
    $ pip install tensorflow-gpu
  - TensorFlow 설치 검증
    $ python
    >>> import tensorflow as tf
    >>> hello = tf.constant('Hello, TensorFlow!')
    >>> sess = tf.Session()
    >>> print(sess.run(hello))
    ..."Hello, TensorFlow!" 메시지가 출력되는지 확인...
  * 참고: https://www.tensorflow.org/install/install_linux#InstallingNativePip

+ (옵션) TensorFlow with docker 설치
  - docker 설치: https://docs.docker.com/engine/installation/
  - nvidia-docker 설치: https://github.com/NVIDIA/nvidia-docker
  - TensorFlow 컨테이너 실행 (1)
    $ sudo nvidia-docker run nvidia/cuda nvidia-smi
  - TensorFlow 컨테이너 실행 (2)
    $ sudo nvidia-docker run -it gcr.io/tensorflow/tensorflow:latest-gpu bash
  * 참고: https://www.tensorflow.org/install/install_linux#InstallingDocker


+ 결과 확인: nvidia GPU driver 동작 잘함

acc@acc-Alienware-17-R3:~$ nvidia-smi
Wed Mar 22 16:07:10 2017       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.39                 Driver Version: 375.39                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 980M    Off  | 0000:01:00.0     Off |                  N/A |
| N/A   53C    P8     7W /  N/A |    335MiB /  4038MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|    0      1236    G   /usr/lib/xorg/Xorg                             159MiB |
|    0      2160    G   compiz                                         114MiB |
|    0      7885    C   python2                                         58MiB |
+-----------------------------------------------------------------------------+


+ 결과 확인: TensorFlow에서 GPU 인식 잘함

acc@acc-Alienware-17-R3:~$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcurand.so.8.0 locally
>>> tf.Session().run()
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE3 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:910] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:885] Found device 0 with properties:
name: GeForce GTX 980M
major: 5 minor: 2 memoryClockRate (GHz) 1.1265
pciBusID 0000:01:00.0
Total memory: 3.94GiB
Free memory: 3.56GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0
I tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0:   Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 980M, pci bus id: 0000:01:00.0)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: run() takes at least 2 arguments (1 given)
>>> 

(이상)

Posted by ingeeC
,