Contents
NVIDIA Driverのインストール
自分のPC環境に合ったドライバーをインストールしていきます。
ここで大事なのは、公式サイトに行って正しい情報をもとにインストールするということです。
下記に書いてあるのは、私のPC環境に合ったドライバーのインストール方法なので
皆さんもこの通りにやればいいというわけではありません。ネット上にはGPU環境をubuntuで構築する方法は沢山記載されていますが、どれも各個人のPCに合ったやり方なだけで、
あなたのPCでうまくいくとは限らないということを理解しておくのが大事だと思います。
それではNvidiaのホームページに行ってインストールしていこう。
まずは下記のURLからアクセスします。
👇 ‘ NVIDIA Data Center GPU Drivers ‘ のブラウザをクリック
👇’ NVIDIA Driver Installation Quick Guide ‘をクリック
👇ガイドに従ってインストール
👇PC内のGPUの状態を確認していきます。ターミナル を開いて以下のコマンドを実行。
下記のようにSMI情報が出てきたらDriverのインストールは完了です。
Dockerのインストール(UbuntuOS 18.04LTS)
Dockerをインストールしhello-worldのDocker image取得までまとめました。
下記を参考に進めてみてください。
1 2 3 4 5 |
<Command> $ sudo apt-get remove docker docker-engine docker.io containerd runc $ sudo apt-get update $ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - |
1 2 3 4 5 |
<Command> $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" $ sudo apt-get update $ sudo apt-get install docker-ce docker-ce-cli containerd.io $sudo docker --version |
1 2 3 4 5 6 7 |
<Command> $ sudo groupadd docker $ sudo gpasswd -a <username> docker $ sudo reboot # このタイミングで一度PCを再起動しておきます $ docker run hello-world |
1 2 3 |
<Command> $ docker images $ docker ps -a |
nvidia-container-toolkitのインストール
これまでで、CUDA DriverとDockerEngineを入れてきました。
次にコンテナにToolkitを構築するためのnvidia-container-toolkitをインストールしていきます。
それではNvidiaさんがGitHubで公開しているチュートリアルを参考にインストールしていきます。
まずは下記のURLからアクセスします。
https://github.com/NVIDIA/nvidia-docker
👇Getting Startedの ‘ installation guide ‘ をクリック
👇’ Installing on Ubuntu and Debian ‘を選択し、NVIDIA Container Toolkitをインストールしていく
👇最後に”$ docker run –rm –gpus all nvidia/cuda:11.0-base nvidia-smi” でエラーが出なければ完了です。これでDockerからGPUにアクセスできるようになりました。
GPU用にDockerfileを作成
nvidia-container-toolkitのインストールでDockerからGPUを起動することができるようになりました。次に皆さんにやってもらいたいこと、分かりますよね?
そう、今のままだとGPUが使えるだけで機械学習のライブラリ(jupyter,tensorflow…etc)はDocker(仮想環境)には存在しません。
では、自分の開発環境似合わせたコンテナはどのように作るのか?
それはDockerfileを作成し、それをビルドしてDocker imageを作り、imageからコンテナ立ち上げ使用していきます。(機械学習ライブラリが元から入っているDocker imageをpullするという方法があります⇨こちらの記事をチェックしてみて下さい)
早速、Dockerfileを作成していこう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<Dockerfile> # 今回はNvidia NGCからDocker imaggeをpullしてきたもの FROM nvcr.io/nvidia/tensorflow:20.02-tf2-py3 RUN apt-get update && apt-get -y upgrade RUN apt-get install -y --no-install-recommends RUN python3 -m pip install --upgrade pip # OpenCV RUN apt-get install -y libgl1-mesa-glx libglib2.0-0 libsm6 libxrender1 libxext6 RUN pip3 install \ opencv-python \ opencv-contrib-python # machine learningのライブラリをインストール RUN pip3 install sklearn pandas pillow matplotlib # jupyterを使用する場合は以下をインストール RUN wget https://repo.continuum.io/achive/Anaconda3-2019.10-Linux-x86_64.sh && \ sh Anaconda3-2019.10-Linux-x86_64.sh -b -p /opt/anaconda3 && \ rm -f Anaconda3-2019.10-Linux-x86_64.sh ENV PATH /opt/anaconda3/bin:$PATH #自分が自由に操作できるディレクトリを作成 WORKDIR /work/ # コマンド指定 CMD ["bin/bash"] # コンテナを起動させたと同時のjupyter labを立ち上げる場合は下記を実行 # CMD ["jupyter", "lab", "--ip=0.0.0.0", "--allow-root", "--LabApp.token="] |
👇上記で作ったDookckerfileをビルドすることでDocker imageを作成し、コンテナ内に入ってみよう
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<Command> # DockerfileからDocker imageを作成 $ dokcker build -f Dockerfile -t docker:gpu . # docker run でコンテナを起動 $ docker run -it --rm --gpus all docker:gpu bash ================ == TensorFlow == ================ NVIDIA Release 20.02-tf2 (build 9892252) TensorFlow Version 2.1.0 Container image Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. Copyright 2017-2019 The TensorFlow Authors. All rights reserved. Various files include modifications (c) NVIDIA CORPORATION. All rights reserved. NVIDIA modifications are covered by the license terms that apply to the underlying project or file. NOTE: MOFED driver for multi-node communication was not detected. Multi-node communication performance may be reduced. NOTE: The SHMEM allocation limit is set to the default of 64MB. This may be insufficient for TensorFlow. NVIDIA recommends the use of the following flags: nvidia-docker run --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 ... root@d6f2544ea6b0:# |
無事にコンテナ内に入ることができました!この環境の中で作業することができるようになりました😎
代表的なエラー ※補足になります。
−−gpus all コマンドでの不具合解決法
dockerコマンドで–gpus allを指定すると起こるエラーで下記が多いです。このエラーが出た場合は下記👇の方法で解決してみてください
$ docker run -it –rm –gpus all docker:gpu bashを実行した際、
docker: Error response from daemon: could not select device driver “” with capabilities: [[gpu]]. のエラーが発生した場合、以下のコマンドを実行する
$ sudo service docker stop
$ sudo service docker start
$ docker run -it –rm –gpus all docker:gpu bash
これで起動したはずです😊
docker-composeコマンドのエラー
cannot update snap namespace: cannot create symlink in “/etc/docker”: existing file in the way のエラーが発生した場合、以下のコマンドを実行する
$ sudo rm -rf /etc/docker
$ sudo snap refresh
$ docker-compose ps
これで起動したはずです😊
nvidiaのgpuメモリが解放されない
DockerコンテナないでGPUを使い機械学習させているとき、このようなエラーをよく吐き出す。
複数gpu環境でchainerを何度も実行していると、メモリが容量オーバーしていると怒られる(out of memory)
gpu状況を確認したところ何も動いてなく、メモリ空き容量が殆どない状況が発生。
1 2 3 4 5 6 7 8 |
root@e416efbee9a2:/work# python >>> import tensorflow as tf >>> tf.test.is_gpu_available() WARNING:tensorflow:From <stdin>:1: is_gpu_available (from tensorflow.python.framework.test_util) is deprecated and will be removed in a future version. -----------------------------------省略------------------------------------------- RuntimeError: CUDA runtime implicit initialization on GPU:0 failed. Status: out of memory |
結論からいうとプロセスが残ってる。最近のchainerってプロセス並列化してるので親を消しても子プロセスがいっぱい残ってる図式のよう。
👇 7861MiB / 7973MiBとメモリをフルで使われてしまっている。。
Processesには何もないのにMemory-Usageでメモリいっぱい使っている。これのせいでout of memoryになって何も実行できない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
root@e416efbee9a2:/work# nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.42.01 Driver Version: 470.42.01 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... On | 00000000:01:00.0 On | N/A | | N/A 41C P8 12W / N/A | 7861MiB / 7973MiB | 7% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| +-----------------------------------------------------------------------------+ |
👇まずメモリが何に使われており、何のプロセスが残っているのか確認
1 |
$ lsof /dev/nvidia* |
👇詳細を確認する方法
1 |
$ ps f -o user,pgrp,pid,pcpu,pmem,start,time,command -p `lsof -n -w -t /dev/nvidia*` |
👇使ってないプロセスを消す。※一括で消えるため、確認してから消すこと
1 |
$ kill -9 $(lsof -t) |
👇メモリの使用状況を確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
root@7e8c0ac45f55:/work# nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.42.01 Driver Version: 470.42.01 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... On | 00000000:01:00.0 On | N/A | | N/A 41C P8 10W / N/A | 366MiB / 7973MiB | 1% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| +-----------------------------------------------------------------------------+ |
366MiB / 7973MiBときれいに整理することができました⭕
<補足>Swap領域をクリアする方法👇
1 |
$ swapoff -a && swapon -a |
Ubuntu メモリを開放する(溜まったキャッシュをクリアしたいとき)
👇”free”コマンドで現在のメモリ使用状況を確認。buff/cacheが3.1GBも溜まっているのが分かる
1 2 3 4 5 |
jetson-nx1:~$ free -h total used free shared buff/cache available Mem: 7.6G 1.6G 4.8G 42M 3.1G 5.8G Swap: 3.8G 0B 3.8G |
👇キャッシュの破棄を実行。これによりdrop_cashedファイルが再生成される
freeで結果確認。buff/cacheがすっきりした。
1 2 3 4 5 6 |
jetson-nx1:~$ sudo sh -c "echo 3 > /proc/sys/vm/drop_caches" jetson-nx1:~$ free -h total used free shared buff/cache available Mem: 7.6G 2.7G 4.2G 165M 716M 4.5G Swap: 3.8G 0B 3.8G |
いかがだったでしょうか?machine learningを扱う者、GPUと仲良くなれるように
ちょっとずつでいいので、一緒に勉強していきましょう!
次回はJetsonをDockerで環境構築する方法について解説していきたいと思います👇
今回はこの辺で、バイバイ👋
すごい参考になりました。
おかげさまでwsl上でgpuを起動できました!
全てが上の通りに順調にできたわけではないですが、一年間いろいろなサイトを見ては失敗していたので初めてできてよかったです。
まだDockerも初心者でどう操作していいのかいまいち分かっていませんが、こちらのサイトを参考にさせていただきたいと思います!
akifu様
いつも当サイトをご覧いただきありがとうございます。
wsl上でgpu起動がうまくいったとのこと、よかったです!!
少しでもお役に立ってたのなら嬉しいです。
私も日々勉強して、そのアウトプットの場としてこのサイトを運営しています。
至らない点、間違い等もあるかと思いますが、その際はぜひご教授いただけると幸いです。