ラベル GPU の投稿を表示しています。 すべての投稿を表示
ラベル GPU の投稿を表示しています。 すべての投稿を表示

2020/04/11

DockerでGPUを使用する

背景


仕事で、複数のエッジコンピュータにデプロイを行うにあたり、Dockerイメージを利用する必要があった


記事の目的


DockerでGPUを使用する


DockerでGPU


ここでは、DockerでGPUを使用する方法について記載する。


DockerでGPUを使用する手順

DockerでGPUを使用する手順は、下記の通りである。
  1. CUDAイメージをpull
  2. $ sudo docker pull nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04
  3. GPUオプション(--gpus all)付きで実行
  4. $ sudo docker run --gpus all nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04 nvidia-smi
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
    |-------------------------------+----------------------+----------------------+
    | 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 108...  Off  | 00000000:17:00.0 Off |                  N/A |
    | 23%   30C    P8     9W / 250W |      2MiB /  8192MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    


備考

  • エラーが出る場合
  • 実行時に下記のようなエラーが出る場合がある。
    $ sudo docker run --gpus all nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04 nvidia-smi
    docker: Error response from daemon: linux runtime spec devices: could not select device driver "" with capabilities: [[gpu]].
    ERROR[0000] error waiting for container: context canceled
    対処法
    1. 対策スクリプトの作成
    2. $ nano ./nvidia-container-runtime-script.sh
      nvidia-container-runtime-script.sh
      curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \
      sudo apt-key add -
        distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
      curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \
        sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
      sudo apt-get update
      sudo apt-get install nvidia-container-runtime
    3. 対策スクリプトの実行
    4. $ chmod 777 ./nvidia-container-runtime-script.sh
      $ sudo ../nvidia-container-runtime-script.sh
    5. dockerサービスの再起動
    6. $ sudo systemctl restart docker
    7. 動作テスト
    8. $ sudo docker run --gpus all nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04 nvidia-smi


まとめ


  • DockerでGPUを使用する方法について調査、記載した


参考文献




変更履歴


  1. 2020/04/11: 新規作成

2019/09/24

NvidiaGPUの温度を取得するスクリプトを作成(Linux)

背景


GPUを搭載したPCでのソフトウェアのヒートランを行った際、GPUの温度をモニタリングする必要があったため、スクリプトを作成した。

記事の目的


NvidiaGPUの温度を取得するスクリプトを作成する

nvidia-smi


ここでは、NvidiaGPUの温度を取得するスクリプトの記述方法について記載する。

スクリプトの作成方法

スクリプトの作成方法は以下の通りである。
  1. スクリプトgpu_temperature_monitoring.shを作成する
  2. #!/bin/bash
    echo "Start to record GPU temperature!"
    DIR_NAME=~/gpu_temperature_log/`date +%Y%m%d`
    LOG_NAME=./`date +%Y%m%d_%H%M%S`_gpu_temperature.log
    mkdir -p $DIR_NAME
    cd $DIR_NAME
    echo "Date,Temperature[C]" >> $LOG_NAME
    while :
    do
        nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits | awk '{ "date +\"%Y/%m/%d %T\"" | getline var; print var "," $0 }' >> $LOG_NAME
        sleep 1
    done
    exit 0
  3. スクリプトに実行権限を与える
  4. $ chmod 777 ./gpu_temperature_monitoring.sh 

スクリプトの実行方法

実行方法は以下の通りである。
$ ./gpu_temperature_monitoring.sh
Start to record GPU temperature!
~/gpu_temperature_monitoring_log/日付/にGPU温度のログが作成される
$ less ./gpu_temperature_log/20190923/20190923_234227_gpu_temperature.log
Date,Temperature[C]
2019/09/23 23:42:27,51
2019/09/23 23:42:28,51
2019/09/23 23:42:29,51
2019/09/23 23:42:30,52

まとめ


  • NvidiaGPUの温度を取得するスクリプトを作成した

参考文献



変更履歴


  1. 2019/09/24: 新規作成

2019/08/25

make時にGPUのアーキテクチャ番号を自動設定させる方法

背景


複数種類の開発環境でまたがってCUDAを利用したプログラムを開発する際、マシンに搭載されたGPUのアーキテクチャに応じて、CMakeLists.txt内のアーキテクチャ番号を毎回書き換える必要があった。メンテナンスの効率化のため、どのGPU搭載のマシンでmakeした場合でも、GPUの種類を識別して、そのGPUに最適なバイナリファイルを生成する環境を構築する。

記事の目的


makeする際に自動で搭載GPUのアーキテクチャを識別し、そのGPUに最適なバイナリーを出力するようにmake環境を構築する

仮想/実アーキテクチャの設定


ここでは、UbuntuにおけるマルチGPU対応のmake環境を構築するための方法について記載する。

nvccのコンパイルオプション

nvccのコンパイルオプションのうち、アーキテクチャに関する部分について記述する。
  • --gpu-architecture (-arch)
  • *.cuが対象にしている仮想アーキテクチャを指定する。したがって、基本的にはcompute_*の中から選択する。
  • --gpu-code (-code)
  • 仮想アーキテクチャのコード(*.ptx)から生成して出力に加えるアーキテクチャを指定する。PTXを含めたいときはcompute_*、特定のGPU向けバイナリを含めたいときはsm_*を選択する。
  • --generate-code arch=compute_*,code=\"compute_*,sm_*\"
  • 上記2つのオプションを一度に設定できる

導入方法

make環境を構築する手順は、下記の通りである。
  1. check_cuda.cuをCMakeLists.txtと同じ階層に置く
  2. // check_cuda.cu
    #include <stdio.h>
    
    int main(int argc, char **argv){
        cudaDeviceProp dP;
        float min_cc = 3.0;
    
        int rc = cudaGetDeviceProperties(&dP, 0);
        if(rc != cudaSuccess) {
            cudaError_t error = cudaGetLastError();
            printf("CUDA error: %s", cudaGetErrorString(error));
            return rc; /* Failure */
        }
        if((dP.major+(dP.minor/10)) < min_cc) {
            printf("Min Compute Capability of %2.1f required:  %d.%d found",
                    min_cc, dP.major, dP.minor);
            printf(" Not Building CUDA Code");
            return 1; /* Failure */
        } else {
            printf("%d%d", dP.major, dP.minor);
            return 0; /* Success */
        }
    }
  3. CMakeLists.txtを編集する
  4. 下記のコードを追加することで、$CUDA_NVCC_FLAGSにコンパイルしたマシンのアーキテクチャを自動設定できる。
    cmake_minimum_required(VERSION 3.0)
    # Find CUDA
    find_package(CUDA)
    
    if (CUDA_FOUND)
      #Get CUDA compute capability
      set(OUTPUTFILE ${CMAKE_CURRENT_SOURCE_DIR}/cuda_script) # No suffix required
      set(CUDAFILE ${CMAKE_CURRENT_SOURCE_DIR}/check_cuda.cu)
      execute_process(COMMAND nvcc -lcuda ${CUDAFILE} -o ${OUTPUTFILE})
      execute_process(COMMAND ${OUTPUTFILE}
                      RESULT_VARIABLE CUDA_RETURN_CODE
                      OUTPUT_VARIABLE ARCH)
      execute_process(COMMAND rm ${OUTPUTFILE})
    
      if(${CUDA_RETURN_CODE} EQUAL 0)
        set(CUDA_SUCCESS "TRUE")
      else()
        set(CUDA_SUCCESS "FALSE")
      endif()
    
      if (${CUDA_SUCCESS})
        message(STATUS "CUDA Architecture: -arch=sm_${ARCH}")
        message(STATUS "CUDA Version: ${CUDA_VERSION_STRING}")
        message(STATUS "CUDA Path: ${CUDA_TOOLKIT_ROOT_DIR}")
        message(STATUS "CUDA Libararies: ${CUDA_LIBRARIES}")
        message(STATUS "CUDA Performance Primitives: ${CUDA_npp_LIBRARY}")
    
        set(CUDA_NVCC_FLAGS "{$CUDA_NVCC_FLAGS};--generate-code arch=compute_${ARCH},code=\"compute_${ARCH},sm_${ARCH}\"")
    
      else()
        message(WARNING -arch=sm_${ARCH})
      endif()
    endif()

まとめ


  • 搭載GPUのアーキテクチャを識別し、そのGPUに最適なバイナリーを出力するmake環境を構築する手順について調査、記載した

参考文献



変更履歴


  1. 2019/08/25: 新規作成

MQTTの導入

背景 IoTデバイスの接続環境構築のため、MQTT(mosquitto)の導入を行った。 記事の目的 MQTT(mosquitto)をUbuntuに導入する mosquitto ここではmosquittoについて記載する。 MQTT MQTT(Message Qu...