NVIDIA H100 (DOK) vs NVIDIA V100 (DOK) vs NVIDIA H100 (DigitalOcean)

## はじめに
株式会社晴工雨読の片山と申します。晴工雨読の概要はこちらからご覧ください。

https://seikoudoku.co.jp/

Techブログ第4弾は、さくらインターネットの高火力DOKで利用できるGPU2種類と、DigitalOceanの新サービスGPU Dropletsで利用できるGPUを用いて、実際にどの程度の実行能力（速度）なのか検証してみた結果を残しておきます。まずそれぞれのツールの概要を、その後実際の手順を備忘録的に述べていきます。

## 高火力DOK(ドック)とは
高火力DOKは、さくらインターネットが提供するコンテナサービスです。高性能GPUが従量課金制かつ比較的低価格で利用できる点が特徴のようです。今回はこのサービスを利用していきます。

https://www.sakura.ad.jp/koukaryoku-dok/

## DigitalOceanとは
DigitalOceanは、AWSやGoogle Cloudよりも比較的簡単でスケーラブルなソリューションを提供するかもしれない、クラウドコンピューティングサービスです。

https://www.digitalocean.com/

今回は、新サービスとして展開されているGPU Dropletsを利用して、Nvidia H100がどの程度の性能を誇るのか検証するために使います。

## 実行手順
### 1. Dockerイメージを作成
任意のディレクトリの中に4つのファイルを配置し、Dockerコマンドを利用して実行確認します。今回はgpu-checkディレクトリと命名したディレクトリにファイルを配置しました。まずは、それぞれのファイルの内容を解説していきます。

```text:directory
gpu-check
├─ Dockerfile
├─ requirements.txt
├─ docker-entrypoint.sh
└─ runner.py
```

今回は、DockerイメージをDockerfileで作成することにしました。ここはファイル内のコメントに解説を記しています。

```Dockerfile:Dockerfile
FROM nvidia/cuda:12.5.1-runtime-ubuntu22.04
ENV DEBIAN_FRONTEND=noninteractive

# 必要なパッケージのインストール
# /appはアプリのディレクトリ、/opt/artifactはアウトプット先のディレクトリ
RUN apt-get update && \
    apt-get install -y \
        git \
        git-lfs \
        python3 \
        python3-pip \
      && \
    mkdir /app /opt/artifact && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# VALL-E Xのリポジトリをクローン
WORKDIR /app
# git-lfsのインストール
# 依存ライブラリのインストール
COPY requirements.txt /app/
RUN pip install -Uq -r requirements.txt
# 出力データをオブジェクトストレージにアップロードするためのライブラリ
RUN pip cache purge

# 実行スクリプト（後で作成）
COPY runner.py /app/
# Dockerコンテナー起動時に実行するスクリプト（後で作成）
COPY docker-entrypoint.sh /
# 実行権限を付与
RUN chmod +x /docker-entrypoint.sh /

WORKDIR /
# Dockerコンテナー起動時に実行するスクリプトを指定して実行
CMD ["/bin/bash", "/docker-entrypoint.sh"]
```

Pythonファイルを実行するためにインストールするライブラリを環境ファイルに記載しておきます。また、shファイルにDockerコンテナ起動時の実行スクリプトを記載しておきます。

```text:requirements.txt
wandb
requests
torch
torchvision
boto3
onnx
```

```sh:docker-entrypoint.sh
#!/bin/bash

set -ue
shopt -s nullglob

export TZ=${TZ:-Asia/Tokyo}

# S3_はすべてboto3用の環境変数です
pushd /app
  python3 runner.py \
	  --s3-bucket="${S3_BUCKET:-}" \
	  --s3-endpoint="${S3_ENDPOINT:-}" \
	  --s3-secret="${S3_SECRET:-}" \
	  --s3-token="${S3_TOKEN:-}"
popd
```

そして、実行するPythonファイルは、[PyTorch | Weights & Biases ドキュメンテーション](https://docs.wandb.ai/ja/tutorials/pytorch/)より取得して、[WandBとさくらインターネットの高火力DOKを組み合わせて使ってみた - Qiita](https://qiita.com/hinatakatayama/items/f60656de7ef3a4eea998)参考に、一部変更して利用しています。

### 2. Docker Hubへイメージをアップロード
Docker Hubへイメージをアップロードして高火力DOKで実行する準備をしていきます。まずDocker(Docker Hub)にログイン後、イメージをビルドし、タグづけ、そしてプッシュを行います。`yourusername`にはユーザ名を、`yourimagename`には任意のイメージ名を入れてください。

```terminal:bash
$ docker login
$ docker buildx create --use
$ docker buildx build --platform linux/amd64,linux/arm64 -t yourusername/yourimagename:latest --push .
```

### 3. 高火力DOKとDigitalOceanでDockerイメージを実行
ではいよいよ、高火力DOKでDockerイメージを実行していきます。[WandBとさくらインターネットの高火力DOKを組み合わせて使ってみた](https://qiita.com/hinatakatayama/items/f60656de7ef3a4eea998)と同様の流れで進められます。また、DigitalOceanでも実行していきます。こちらもHow-toは[DigitalOcean GPU Droplets: Scalable Computing Power on Demand](https://www.youtube.com/watch?v=9R7MaiyQogU)と同様の流れで進められるので、割愛します。

まとめると、ここでは次の3つのプランを検証しました。
- a. DOK v100-32gbプランで利用できるNVIDIA V100
- b. DOK h100-80gbプランで利用できるNVIDIA H100
- c. DigitalOcean GPU Dropletで利用できるNVIDIA H100 

## 4. 実行結果とその考察
実行結果として、パフォーマンス値を算出してみます。ただしパフォーマンス値とは、NVIDIA V100を利用した場合の実行時間を1.00としたときの、その他のNVIDIA H100を利用した場合の実行時間の値のことです。
| サービス名 | V100(DOK) | H100(DOK) | H100 (DigitalOcean) |
| -: | :-: | :-: | :-: |
| パフォーマンス値 | 1.000 | 1.152 | 1.233 |

実験結果についていくつか考察していきます。

「H100は前世代のV100と比較して、2~3倍の実行速度（パフォーマンス）である」と確認している記事が存在していましたが、今回の実験結果では、H100は前世代のV100と比較して、平均1.1925の実行速度（パフォーマンス）と確認できました。今回の処理は比較的軽いと思われるため、より重い処理を行うことによってさらに大きな性能差が出ると予想されます。

そして、DOKとDigitalOceanの間では大きな実行速度（パフォーマンス）の差はないという示唆も得られました。先に書いた通り、より重い処理を何パターンか行わせることで、実際の作業における性能差がわかるのではないでしょうか。

## おわりに
今回は、さくらインターネットの高火力DOKで利用できるGPU2種類と、DigitalOceanの新サービスGPU Dropletsで利用できるGPUを用いて、実際にどの程度の実行能力（速度）なのか検証してみました。さまざまなところでGPUサービスが拡張されていくのは個人開発や小規模開発の際には特に嬉しいですね。

## 参考文献
- [GPUの使用方法 | さくらのクラウド マニュアル](https://manual.sakura.ad.jp/cloud/koukaryoku-container/using-gpu.html)
- [NVIDIA CUDA | Docker Hub](https://hub.docker.com/r/nvidia/cuda)
- [H100 CNX vs Tesla V100 PCIe 32 GB：どちらが良いですか？](https://www.topcpu.net/ja/gpu-c/h100-cnx-vs-tesla-v100-pcie-32-gb)
- [DockerをつかったGPUベンチマーク](https://zenn.dev/usagi1975/articles/2023-02-18-1400_docker-gpu-bench)
- [A100GPUでGPU Benchmark 動かしてみた | IIJ Engineers Blog](https://eng-blog.iij.ad.jp/archives/24852)