【Docker14】Dockerを使い、UbuntuOSでGPU環境構築する

NVIDIA Driverのインストール

自分のPC環境に合ったドライバーをインストールしていきます。
ここで大事なのは、公式サイトに行って正しい情報をもとにインストールするということです。

下記に書いてあるのは、私のPC環境に合ったドライバーのインストール方法なので
皆さんもこの通りにやればいいというわけではありません。ネット上にはGPU環境をubuntuで構築する方法は沢山記載されていますが、どれも各個人のPCに合ったやり方なだけで、
あなたのPCでうまくいくとは限らないということを理解しておくのが大事だと思います。

それではNvidiaのホームページに行ってインストールしていこう。
まずは下記のURLからアクセスします。

https://docs.nvidia.com/

👇 ‘ NVIDIA Data Center GPU Drivers ‘ のブラウザをクリック

👇’ NVIDIA Driver Installation Quick Guide ‘をクリック

👇ガイドに従ってインストール

👇PC内のGPUの状態を確認していきます。ターミナル を開いて以下のコマンドを実行。
 下記のようにSMI情報が出てきたらDriverのインストールは完了です。

Dockerのインストール(UbuntuOS 18.04LTS)

Dockerをインストールしhello-worldのDocker image取得までまとめました。
下記を参考に進めてみてください。

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を作成していこう。

👇上記で作ったDookckerfileをビルドすることでDocker imageを作成し、コンテナ内に入ってみよう

無事にコンテナ内に入ることができました!この環境の中で作業することができるようになりました😎

代表的なエラー ※補足になります。

−−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状況を確認したところ何も動いてなく、メモリ空き容量が殆どない状況が発生。

結論からいうとプロセスが残ってる。最近のchainerってプロセス並列化してるので親を消しても子プロセスがいっぱい残ってる図式のよう。

👇 7861MiB / 7973MiBとメモリをフルで使われてしまっている。。
Processesには何もないのにMemory-Usageでメモリいっぱい使っている。これのせいでout of memoryになって何も実行できない。

👇まずメモリが何に使われており、何のプロセスが残っているのか確認

👇詳細を確認する方法

👇使ってないプロセスを消す。※一括で消えるため、確認してから消すこと

👇メモリの使用状況を確認

366MiB / 7973MiBときれいに整理することができました⭕

<補足>Swap領域をクリアする方法👇

Ubuntu メモリを開放する(溜まったキャッシュをクリアしたいとき)

👇”free”コマンドで現在のメモリ使用状況を確認。buff/cacheが3.1GBも溜まっているのが分かる

👇キャッシュの破棄を実行。これによりdrop_cashedファイルが再生成される
 freeで結果確認。buff/cacheがすっきりした。

いかがだったでしょうか?machine learningを扱う者、GPUと仲良くなれるように
ちょっとずつでいいので、一緒に勉強していきましょう!

次回はJetsonをDockerで環境構築する方法について解説していきたいと思います👇

今回はこの辺で、バイバイ👋

2件のコメント

すごい参考になりました。
おかげさまでwsl上でgpuを起動できました!
全てが上の通りに順調にできたわけではないですが、一年間いろいろなサイトを見ては失敗していたので初めてできてよかったです。
まだDockerも初心者でどう操作していいのかいまいち分かっていませんが、こちらのサイトを参考にさせていただきたいと思います!

akifu様

いつも当サイトをご覧いただきありがとうございます。
wsl上でgpu起動がうまくいったとのこと、よかったです!!
少しでもお役に立ってたのなら嬉しいです。

私も日々勉強して、そのアウトプットの場としてこのサイトを運営しています。
至らない点、間違い等もあるかと思いますが、その際はぜひご教授いただけると幸いです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です