Ubuntu 22.04 NVIDIA GeForce GTX 1070 Dockerイメージを取得 メモ

環境
Ubuntu 22.04
GPU: GeForce GTX 1070


# まずはcurlのインストール
```
sudo apt install curl
```

curlは、コマンドラインで使用することができるデータ転送ツールです。主にURLを指定して、HTTP、HTTPS、FTP、SFTPなどのプロトコルを使用してデータを送受信します。以下はcurlの主な特徴と使用方法の説明です。

データ転送: curlは、指定したURLからデータを取得したり、データを送信したりするためのツールです。HTTPリクエストやファイルのアップロード、ダウンロードなど、さまざまなデータ転送操作をサポートしています。

サポートするプロトコル: curlは、HTTP、HTTPS、FTP、SFTP、SCPなど、さまざまなネットワークプロトコルをサポートしています。これにより、さまざまな種類のリソースやサービスにアクセスできます。

多機能: curlは非常に多機能なツールであり、さまざまなオプションとフラグを使用してさまざまな操作を実行できます。例えば、ヘッダーの表示、POSTリクエストの送信、ファイルのダウンロード、ファイルのアップロード、ユーザー認証などが可能です。

カスタマイズ可能: curlは、さまざまなオプションや設定を使用して、データ転送の方法や振る舞いをカスタマイズできます。タイムアウト時間の設定、ユーザーエージェントの指定、プロキシの使用など、さまざまな設定が可能です。

コマンドラインツール: curlはコマンドラインから実行することができるため、シェルスクリプトやコマンドラインの操作に組み込むことが容易です。また、シンプルな構文とコマンドラインオプションの使用により、簡単に使用できます。


# 記事を参考にインストールの実施
Ubuntu 22.04にNVIDIA Container Toolkit (nvidia-docker)をインストール

https://docs.docker.com/engine/install/ubuntu/

サイトより

Install Docker Engine on Ubuntu
To get started with Docker Engine on Ubuntu, make sure you meet the prerequisites, and then follow the installation steps.

Prerequisites
Note

If you use ufw or firewalld to manage firewall settings, be aware that when you expose container ports using Docker, these ports bypass your firewall rules. For more information, refer to Docker and ufw.

OS requirements
To install Docker Engine, you need the 64-bit version of one of these Ubuntu versions:

Ubuntu Lunar 23.04
Ubuntu Kinetic 22.10
Ubuntu Jammy 22.04 (LTS)
Ubuntu Focal 20.04 (LTS)
Docker Engine is compatible with x86_64 (or amd64), armhf, arm64, and s390x architectures.

Uninstall old versions
Before you can install Docker Engine, you must first make sure that any conflicting packages are uninstalled.

Distro maintainers provide an unofficial distributions of Docker packages in APT. You must uninstall these packages before you can install the official version of Docker Engine.

The unofficial packages to uninstall are:

docker.io
docker-compose
docker-doc
podman-docker
Moreover, Docker Engine depends on containerd and runc. Docker Engine bundles these dependencies as one bundle: containerd.io. If you have installed the containerd or runc previously, uninstall them to avoid conflicts with the versions bundled with Docker Engine.

Run the following command to uninstall all conflicting packages:
```
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
```

Installation methods
You can install Docker Engine in different ways, depending on your needs:

Docker Engine comes bundled with Docker Desktop for Linux. This is the easiest and quickest way to get started.

Set up and install Docker Engine from Docker’s apt repository.

Install it manually and manage upgrades manually.

Use a convenience scripts. Only recommended for testing and development environments.

Install using the apt repository
Before you install Docker Engine for the first time on a new host machine, you need to set up the Docker repository. Afterward, you can install and update Docker from the repository.

Set up the repository
Update the apt package index and install packages to allow apt to use a repository over HTTPS:

```
 sudo apt-get update
 sudo apt-get install ca-certificates curl gnupg
```
Add Docker’s official GPG key:

```
 sudo install -m 0755 -d /etc/apt/keyrings
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
 sudo chmod a+r /etc/apt/keyrings/docker.gpg
```

Use the following command to set up the repository:

```
 echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

If you use an Ubuntu derivative distro, such as Linux Mint, you may need to use UBUNTU_CODENAME instead of VERSION_CODENAME.

Install Docker Engine
Update the apt package index:

```
sudo apt-get update
Install Docker Engine, containerd, and Docker Compose.
```
# NVIDIA Container Toolkit (nvidia-docker) のインストール
NVIDIA Container Toolkitは、Dockerコンテナ内でGPUを使用するためのツールセットです。CUDAイメージの実行やGPUリソースの制御など、さまざまな機能を提供します。

NVIDIA Container Toolkit (nvidia-docker) のインストール
Ubuntu に NVIDIA Container Toolkit をインストールする手順は、github.com, docker.com で紹介されています。

https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(Native-GPU-Support)


https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker



# CDI（Container Device Interface）のインストール

CDI（Container Device Interface）仕様は、NVIDIA Container Toolkitによって提供されるGPUデバイスのコンテナへの統合を容易にするための仕様です。CDIは、ホスト上のGPUデバイスをコンテナ内のアプリケーションに公開するための設定情報を提供します。

CDI仕様は、YAML形式のファイルとして表現されます。このファイルには、コンテナがアクセスすることができるホスト上のデバイスの詳細な設定が含まれています。CDI仕様には、デバイスの識別子、ドライバのバージョン、メモリの割り当てなどの情報が含まれます。

CDIを使用すると、コンテナ内のアプリケーションはホスト上のGPUデバイスを直接利用できます。これにより、機械学習や科学計算などのGPUを使用するアプリケーションをコンテナ化する際に、シームレスなGPUアクセスが可能となります。

CDI仕様の生成には、NVIDIA Container Toolkitのコマンドラインツールであるnvidia-ctkを使用します。CDI仕様の生成後、コンテナランタイム（例：Docker）は、CDI仕様を使用してコンテナとホストの間のGPUデバイスの接続を確立します。

CDI仕様を生成することで、ホスト上のGPUデバイスをコンテナ内のアプリケーションが利用できるようにするための一貫した方法を提供します。これにより、GPUを使用するアプリケーションのコンテナ化やデプロイメントが容易になります。


https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

すべてのデバイスを参照するCDI（Container Device Interface）仕様を生成するために、次のコマンドを使用します

```
sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
```

このコマンドを実行することで、/etc/cdi/nvidia.yamlというファイルにCDI仕様が生成されます。

生成されたデバイスの名前を確認するには、次のコマンドを実行します：

```
grep "  name:" /etc/cdi/nvidia.yaml
```

このコマンドは、/etc/cdi/nvidia.yamlファイル内の「name:」というキーワードを含む行を検索し、デバイスの名前を表示します。

CDI仕様の使用方法：

注意：

CDIを使用してNVIDIAデバイスを注入することは、NVIDIA Container Runtimeフックの使用と競合する可能性があります。
これは、/usr/share/containers/oci/hooks.d/oci-nvidia-hook.jsonファイルが存在する場合、削除するか、NVIDIA_VISIBLE_DEVICES環境変数を設定してコンテナを実行しないように注意する必要があります。

CDI仕様の使用は、使用されているCDI対応のコンテナエンジンやCLIに依存します。たとえば、podmanの場合、v4.1.0以降のリリースでは、--deviceフラグでCDIデバイスを指定するサポートが含まれています。上記のように仕様が生成されたと想定して、すべてのNVIDIA GPUにアクセスするためにコンテナを実行するには、次のコマンドが必要です：

```
podman run --rm --device nvidia.com/gpu=all ubuntu nvidia-smi -L
```

このコマンドは、ホスト上で実行されたnvidia-smi -Lと同じ出力を表示するはずです。

CDI仕様には個々のGPUまたはMIGデバイスへの参照も含まれており、コンテナを起動する際にそれらの名前を指定して要求することができます。例えば：

```
podman run --rm --device nvidia.com/gpu=gpu0 --device nvidia.com/gpu=mig1:0 ubuntu nvidia-smi -L
```
これは、インデックス0のフルGPUとGPU 1の最初のMIGデバイスを要求します。出力には要求されたデバイスのUUIDのみが表示されるはずです。


Docker CEをインストールするには、サポートされているLinuxディストリビューションの公式の手順に従ってください。以下のドキュメントでは、さまざまなLinuxディストリビューションにDockerをインストールする手順も含まれています。

# UbuntuとDebianのインストール

UbuntuとDebianのインストール：

以下の手順は、Ubuntu LTS（18.04、20.04、22.04）およびDebian（Stretch、Buster）ディストリビューションでNVIDIA Container Toolkitをセットアップするために使用できます。

# Dockerのセットアップ

UbuntuでのDocker-CEのセットアップには、Dockerの公式の便利なスクリプトを使用できます：

```
curl https://get.docker.com | sh \
  && sudo systemctl --now enable docker
```
これにより、Ubuntu上でDocker-CEがセットアップされます。


NVIDIA Container Toolkitのセットアップ手順は以下の通りです。

パッケージリポジトリとGPGキーの設定を行います。以下のコマンドを実行してください。
```
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
```
パッケージリストを更新し、nvidia-container-toolkitパッケージとその依存関係をインストールします。以下のコマンドを実行してください。

```
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
```
DockerデーモンをNVIDIA Container Runtimeを認識するように設定します。以下のコマンドを実行してください。

```
sudo nvidia-ctk runtime configure --runtime=docker
```

デフォルトのランタイムが設定された後、Dockerデーモンを再起動してインストールを完了します。以下のコマンドを実行してください。
```
sudo systemctl restart docker
```
これでセットアップが完了しました。
動作を確認するために、以下のコマンドでベースのCUDAコンテナを実行できます。

```
sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
```
これにより、CUDAを使用したコンテナが正常に実行され、NVIDIAドライバとランタイムが適切に機能しているかどうかが確認できます。


以下のコマンドを実行した結果、正常に動作しました。

```
sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
```
まず、イメージ nvidia/cuda:11.6.2-base-ubuntu20.04 がローカルに存在しなかったため、Dockerはイメージを取得しました。取得が完了すると、以下の情報が表示されました：

NVIDIA-SMIのバージョン情報
ドライバのバージョン情報
CUDAのバージョン情報
GPUの名前、状態、使用状況（温度、パフォーマンス、電力使用量など）
メモリ使用状況
GPUの利用率と計算モード
実行中のプロセスの情報（PID、プロセス名、GPUメモリ使用状況）

この結果によれば、NVIDIA GeForce GTX 1070というGPUが検出され、
メモリ使用状況やパフォーマンスなどが表示されました。

これにより、正常にCUDAおよびNVIDIAドライバがコンテナ内で動作していることが確認できます。