インスタンス上でコンテナを立ち上げる際の注意点と便利な確認コマンド

# 背景と概要
GPU環境が用意されているインスタンス上でのコンテナ起動を行いました。コンテナ内ではGPUを使用した処理実行を前提としています。
環境構築の経験が全くなかったため、その際に躓いてしまったことなどをまとめ記載しようと思います。なお、今回はDocker Composeを使用して立ち上げています。
また、コンテナ立ち上げの際に便利だったコマンドもまとめています。

# インスタンス上でコンテナ起動
## 前提確認
まずはそのインスタンスに何がインストールされていて使用できる状態かを確認します。
```
dpkg -l | grep nvidia 
dpkg -l | grep cuda 
```
このコマンドによって、インストールされているパッケージやライブラリの「バージョン」「アーキテクチャ情報」「詳細説明」の一覧を取得することができます。

次に、GPUの状態や情報(cuda versionやdriver versionなど)については以下のコマンドを実行します。なお、このコマンドは処理実行中におけるGPUリソースの使用状況などを確認する際も便利です。
```
nvidia-smi
```
また、この詳細情報を得るには以下のコマンドを実行してください。NVIDIAの公式ページにも詳細について紹介されています。
[Useful nvidia-smi Queries] 
https://nvidia.custhelp.com/app/answers/detail/a_id/3751/~/useful-nvidia-smi-queries
```
nvidia-smi --help-query-gpu
```
なお、CUDA ツールキットはCUDA マイナーバージョンの互換性のために必要な最小ドライバーバージョンが指定されており、以下のURLから確認ができます。
基本的にcuda-toolkitのインストールでdriverもインストールされますが、あえて別々にインストールしたい場合などはこの制約に注意する必要があります。
[NVIDIA CUDA Toolkit Release Notes] 
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#id4

## イメージのビルド
インスタンス上のGPU環境をインスタンス上でも使用する場合、Dockerfileにおいてもcuda-toolkitのインストールが必要です。
最新・アーカイブを含めたtoolkitのインストールコマンドはこちらからも確認ができます。
[CUDA Toolkit Archive]
https://developer.nvidia.com/cuda-toolkit-archive
今回はcuda version11.7で、以下のコマンドを参考にしました。

![スクリーンショット 2023-12-08 195158.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632319/5726fd57-f8c9-4c0f-fdae-04085c20fb84.png)

なお、このコマンドの最終行は以下のコマンドとなっていますが、単にこのコマンドを実行してしまうと最新バージョンのcudaがインストールされるのでご注意ください。
```
sudo apt-get -y install cuda　#最新バージョンがインストールされる
sudo apt-get -y install cuda-11-7 #このようにバージョン指定を行う
```

また、ymlファイルには以下の情報を記載しています。
この情報を加えることで、コンテナがホストマシン上のすべてのNVIDIA GPUにアクセスでき、また処理にGPUが使用されるようになります。
```
version: '3.8'
services:
  ・・・
    deploy:
      resources:
        reservations:
          devices:
          - driver: nvidia
            capabilities: [gpu]
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=compute,utility
```

次に、コンテナ内でGPUを用いた処理を行う場合、pytorchのバージョンも考慮する必要があります。
PyTorchは特定のCUDAバージョンと互換性があるため、Pytorchの公式ドキュメントなどを参考にしながらインストールをしてください。
[PyTorch]
https://pytorch.org/get-started/locally/
ちなみに、今回のcuda versionが11.7の場合は以下のコマンドをDockerfileに追記することでcudaのバージョンに合ったpytorchをインストールすることができます。
```
# CUDA 11.7
pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2
```

## コンテナの起動
イメージのビルドが終了すれば、そのイメージを使用してコンテナを起動します。
今回はymlファイルでGPUの設定を行っているので、コンテナ起動時に--gpus オプションなどを付け加える必要はないです。
コンテナ起動後は、実際にそのコンテナ内でnvidia-smiコマンドを実行してGPUの環境を確認してみてください。

## 補足
ネットワークについて
GPUのクラウドサービスを使用する場合は、ネットワークを考慮しないといけない場合があります。Docker では、インストールにより自動的に３つのネットワークが作成されますが、その全ての環境には、docker0 と表示されるブリッジ（ bridge ）ネットワークが現れます。オプションで docker run --net=<ネットワーク名> を指定しない限り、Docker デーモンはデフォルトでこのネットワークにコンテナを接続します。そのため、自動的に接続したネットワークがクラウドサービスのローカルネットワークとバッティングすることで、インスタンス接続ができなくなることがあります。
バッティングしないようにネットワークを指定してあげることで、この問題は解消できると思います。なお、ymlファイルでもネットワークの指定は可能です。
これはdockerの公式などを参考にしてみてください。
[Docker コンテナ・ネットワークの理解]
https://docs.docker.jp/engine/userguide/networking/dockernetworks.html#id3
[network コマンドを使う]
https://docs.docker.jp/engine/userguide/networking/work-with-networks.html


# 便利な確認コマンド
ここでは今回のような環境構築で役に立ったコマンドを紹介します。既に上記で記載しているものも再度まとめてあります。
```
#インストールされているものを確認する
dpkg -l | grep nvidia 
dpkg -l | grep cuda

#GPUの状況や情報を確認する
nvidia-smi
watch -d -n 0.5 nvidia-smi #0.5秒ごとに確認

#CPUなどの状況確認
top

#pytorchのバージョン確認
import torch
print(torch.__version__)

#cuda使用の確認
print(torch.cuda.is_available())

#cudnn使用の確認
print(torch.backends.cudnn.is_available())

#ネットワーク一覧の表示
docker network ls
```

以上になります。
環境構築は躓きやすいポイントでもあるので、何かお役に立てれば幸いです。
引き続き環境構築周りは勉強していきたいと思います！