Jetson TX1의 GPU 성능 조사 2 (MNIST에서 숫자 인식)

Jetson TX1의 GPU를 사용한 효능을 조사 그 2로서,
Chainer의 샘플에 준비되어 있는 MNIST의 숫자 인식을 실시했습니다.

코드는 여기 (GitHub에서 공개되는 Chainer 샘플 코드)
htps : // 기주 b. 이 m/pf네 t/짱네 py

조사 내용



계산 시간을 아래의 테스트 1~4에 대해 프로그램의 처리 시간을 측정한다.
※Jetson TX1의 경우의 처리 시간입니다

테스트 1 CPU와 GPU 비교


  • Jetson TX1 CPU에서 MNIST
  • Jetson TX1의 GPU에서 MNIST

  • 테스트 2 배치 크기 (batchsize) 변경


  • GPU 사용
  • 기본값: 100
  • 조건: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000

  • 테스트 3 중간층의 노드 수(units)를 변화


  • GPU 사용
  • 기본값: 1000
  • 조건: 100, 500, 1000, 1500, 2000

  • 테스트 4 batchsize와 units의 조합 변경


  • GPU 사용
  • 배치 크기: 100, 1000
  • 중간 계층 노드 수: 500, 1000, 2000

  • 조사 방법



    계산 시간의 측정 방법



    파이썬 코드를 호출 할 때 명령 줄에서 다음을 실행합니다.
    $ time python train_mnist.py
    

    그러면 이런 식으로 결과가 출력됩니다.
    $ time python test.py
    
    real    1m2.345s
    user    1m1.111s
    sys     0m0.003s
    

    이번은 「프로그램 자체의 처리 시간」에 주목하고 싶기 때문에 user로 나타낸 시간을 평가 지표로 합니다.
    (참고) time 명령으로 프로그램 실행 시간 알아보기 : ぃ tp // 이 m/토 sh/있어 ms/659에 5934에 52b38183200

    측정 조건 변경 방법



    train_mnist.py의 31~43행에서 본 프로그램을 호출할 때의 옵션(추가 인수)에 대한 설명이 기재되어 있다.
    디폴트의 ​​값을 사용할 때는 옵션을 지정하지 않아도 된다.
  • (예) 배치 크기 (batchsize)를 1000, 중간 계층의 노드 수 (units)를 200으로 설정하고 싶을 때
  • 명령 줄에서 "python train_mnist.py -b 1000 -u 200"으로 실행


  • train_mnist.py
        # 省略
        # ↓31~43行目
        parser.add_argument('--batchsize', '-b', type=int, default=100,
                            help='Number of images in each mini-batch')
        parser.add_argument('--epoch', '-e', type=int, default=20,
                            help='Number of sweeps over the dataset to train')
        parser.add_argument('--gpu', '-g', type=int, default=-1,
                            help='GPU ID (negative value indicates CPU)')
        parser.add_argument('--out', '-o', default='result',
                            help='Directory to output the result')
        parser.add_argument('--resume', '-r', default='',
                            help='Resume the training from snapshot')
        parser.add_argument('--unit', '-u', type=int, default=1000,
                            help='Number of units')
        args = parser.parse_args()
        # 省略
    

    CPU와 GPU 전환


  • CPU를 사용하는 경우
  • 명령 "python train_mnist.py -g -1"=> "GPU 사용 안함"선언
  • (기본값이 GPU를 사용하지 않는 설정이므로 "time python train_mnist.py"로 좋음)

  • GPU를 사용하는 경우
  • 명령 "python train_mnist.py -g 0"=> "GPU 사용"선언


  • 배치 크기 변경


  • 명령 "python train_mnist.py -b 1000"
  • 기본 배치 크기는 100

  • 중간 계층의 노드 수 변경


  • "python train_mnist.py -u 2000"명령
  • 기본 중간 계층의 노드 수는 1000

  • 조사 결과



    GPU를 사용하면 NMINST의 학습은 매우 빨라진다.
    배치 크기를 늘리면 계산 시간이 빨라지지만 어느 정도 커지면 그 이후에는 극적인 변화가 없습니다.
    (아마도 중간 계층의 노드 수에 가까워짐에 따라 데이트 경감률이 작아지고있다)
    중간층의 노드를 2배로 늘려도 계산 시간은 10%밖에 증가하지 않는다.
    ※Jetson TX1의 경우의 처리 시간입니다

    테스트 1 CPU와 GPU 비교



    CPU에 GPU를 사용하면 74 배 빠른, 굉장!!
    (기본 조건으로 측정)


    테스트 2 배치 크기 (batchsize) 변경





    테스트 3 중간층의 노드 수(units)를 변화





    테스트 4 batchsize와 units의 조합 변경



    (모두 GPU 사용)


    (덤) Windows PC에서 MNIST


  • 기본 조건으로 약 30분
  • GPU: 없음, CPU: Core i7 2.4GHz 4코어, RAM: 8GB

  • 결론



    꽤 재미있는 결과가 된 것 같습니다.
    중간층의 수가 20배(units=100과 2000으로 비교)의 큰 네트워크에서도 계산 시간은 30% 정도밖에 변하지 않는 것도 충격이었습니다.

    좋은 웹페이지 즐겨찾기