💠

GemmaをDocker for Windowsで動かす

2024/02/24に公開

はじめに

Docker環境があるならWindowsでも動くと思ったので試したときのメモ

途中までは参考リンクのとおりだが、GPU推論のところでDockerfileの修正を行った。

参考:

https://zenn.dev/karaage0703/articles/f32007cc1666e9

環境

  • Windows 11 22H2
  • RTX 3060
  • Powershell

大まかな手順

前提:Dockerがインストールされていること

  1. モデルをダウンロードする
  2. PyTorch構成済みのDockerイメージをビルド
  3. 推論実行(CPU/GPU)

モデルのダウンロード

以下からアクセスリクエストを送る

https://ai.google.dev/gemma?hl=ja

PyTorchのモデル(2b)をダウンロード

Gemma実行環境セットアップ

以下リポジトリ内のコマンドをWindows(Powershell)に置き換えて実行します。

https://github.com/google/gemma_pytorch

リポジトリをクローン

git clone https://github.com/google/gemma_pytorch
cd gemma_pytorch

Dockerイメージをビルド

$Env:DOCKER_URI="gemma:$Env:USERNAME"
docker build -f docker/Dockerfile ./ -t $Env:DOCKER_URI

モデルに関する環境変数をセット

今回はクローンしてきたリポジトリ下にモデルを置いたが多分どこでもいい

$Env:VARIANT="2b"
$Env:CKPT_PATH="C:\Users\$Env:USERNAME\Workspace\github\gemma_pytorch\ckpt"

推論

CPU

$Env:PROMPT="The meaning of life is"
docker run -t --rm `
    -v ${Env:CKPT_PATH}:/tmp/ckpt `
    $Env:DOCKER_URI `
    python scripts/run.py `
    --ckpt=/tmp/ckpt/gemma-2b.ckpt `
    --variant=$Env:VARIANT `
    --prompt=$Env:PROMPT
    # add `--quant` for the int8 quantized model.

出力:

/opt/conda/lib/python3.10/site-packages/torch/_utils.py:831: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly.  To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage()
  return self.fget.__get__(instance, owner)()
Model loading done
======================================
PROMPT: The meaning of life is
RESULT:  explained in this podcast, in which I give a simple yet profound answer that was revealed to me. I will not bore you with my 25 year long story of spiritual education and training but will leave you with a simple question that you may ask yourself. The answer has everything to do with our day to day activities of how we live.  We can either go on a spiritual path of enlightenment or fall back into this world. While being here in this physical state of being we have to keep
======================================

このポッドキャストでは、私に明らかになったシンプルだが奥深い答えを説明しています。 私の25年にわたる霊性の教育と訓練の物語を退屈させるつもりはありませんが、あなた自身に尋ねるかもしれない単純な質問を残したいと思います。 その答えは、私たちがどのように生きるかという日々の活動にすべて関係しています。 私たちは悟りのスピリチュアルな道を進むこともできるし、この世界に戻ることもできます。 この物理的な状態でここにいる間、私たちは維持しなければなりません

深いようで浅いような感じ

GPU

❯ docker run -t --rm `
∙     --gpus all `
∙     -v ${Env:CKPT_PATH}:/tmp/ckpt `
∙     ${Env:DOCKER_URI} `
∙     python scripts/run.py `
∙     --device=cuda `
∙     --ckpt=/tmp/ckpt/gemma-2b.ckpt  `
∙     --variant="${Env:VARIANT}" `
∙     --prompt="${Env:PROMPT}"

出力:

/opt/conda/lib/python3.10/site-packages/torch/_utils.py:831: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly.  To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage()
  return self.fget.__get__(instance, owner)()
Model loading done
======================================
PROMPT: The meaning of life is
RESULT:  often lost on the way, just as it is lost on the way back.

The story of Hanazuki may seem simple enough when you first glance at the narrative or look deeper into the background of the original series but it is one that cannot be lost sight of. Hanazuki's life is tied in with the spirit of the moon and the creation of the moon itself.

The story and symbolism can be easily dismissed as a simple exploration of a young girl's journey through
======================================

帰り道で道に迷うのと同じように、行きでも道に迷うことがよくあります。

『ハナミズキ』の物語は、物語を一見すると単純に見えたり、原作シリーズの背景を深く掘り下げてみると、決して見逃せないものです。 花月の人生は月の精霊と月そのものの創造と結びついています。

この物語と象徴性は、若い女の子の旅を単純に探求するものとして簡単に無視されてしまいます。

なんとなく文学的

テイラー・スウィフトとは…

別の入力(Taylor swift is)でテスト

CPU

en ja(Google翻訳)
the beautiful singer of America living her best life. She has made people fall in love with her. Taylor was not a superstar before but <strong>Taylor swift net worth</strong> is increasing nowadays and today we will know Why Taylor Swift Is so Rich & Famous? Everyone wanted to know how rich Taylor swift is! I’m actually doing her net worth here today and you are going to be surprised. Taylor is one of the richest singers in the world today and you will be amazed to see her net アメリカの美しい歌手は最高の人生を送っています。 彼女は人々を彼女に恋させてきました。 テイラーは以前はスーパースターではありませんでしたが、 最近では<strong>テイラー・ スウィフトの純資産</strong>が増加しており、今日ではなぜテイラー・スウィフトがそれほど裕福で有名なのかがわかります。誰もがテイラー・スウィフトがどれほど裕福であるかを知りたがりました! 私は今日ここで彼女の純資産を実際に計算していますが、あなたは驚くでしょう。 テイラーは今日世界で最も裕福な歌手の一人であり、彼女のネットを見たら驚かれるでしょう。

お金のこととかちょっと俗っぽい

GPU

en ja(Google翻訳)
considered one of the best selling artist in the world and the main reason for that is the influence she has on her fans. Taylor makes quite an impact as her music touches many people and is greatly relatable to them. Her musical style is similar to the Pop genre and many people enjoy to listen to her songs. Taylor is also known for her collaborations with other artists like Selena Gomez, Camila Cabello and more. She has 14 studio albums in her catalog that feature her many hit songs. 世界で最も売れているアーティストの一人とみなされており、その主な理由は彼女がファンに与えている影響力です。 テイラーは、彼女の音楽が多くの人々に感動を与え、彼らに非常に共感を与えるため、非常に大きな影響を与えています。 彼女の音楽スタイルはポップジャンルに似ており、多くの人が彼女の曲を楽しんでいます。 テイラーは、セレーナ・ゴメス、カミラ・カベロなどの他のアーティストとのコラボレーションでも知られています。 彼女のカタログには、彼女の多くのヒット曲が収録された 14 枚のスタジオ アルバムがあります。

簡潔に伝えようとする気概がなんとなく伝わる

GPU推論がうまくいかないとき

自分の環境では、最初に推論を実行したときに以下エラーで失敗した。

/opt/conda/lib/python3.10/site-packages/torch/_utils.py:831: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly.  To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage()
  return self.fget.__get__(instance, owner)()
Traceback (most recent call last):
  File "/workspace/gemma/scripts/run.py", line 79, in <module>
    main(args)
  File "/workspace/gemma/scripts/run.py", line 49, in main
    model = model.to(device).eval()
  File "/opt/conda/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1160, in to
    return self._apply(convert)
  File "/opt/conda/lib/python3.10/site-packages/torch/nn/modules/module.py", line 810, in _apply
    module._apply(fn)
  File "/opt/conda/lib/python3.10/site-packages/torch/nn/modules/module.py", line 833, in _apply
    param_applied = fn(param)
  File "/opt/conda/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1158, in convert
    return t.to(device, dtype if t.is_floating_point() or t.is_complex() else None, non_blocking)
  File "/opt/conda/lib/python3.10/site-packages/torch/cuda/__init__.py", line 298, in _lazy_init
    torch._C._cuda_init()
RuntimeError: No CUDA GPUs are available

CUDAが認識されていないと思い、Docker環境に入って確認(torch.cuda.is_available())したところやはり認識できていなかった。

$ python -c "import torch; print(torch.cuda.is_available())"
False
$ nvidia-smi
Fri Feb 23 16:39:05 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.10              Driver Version: 551.61         CUDA Version: 12.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 RTX 3060        On  |   00000000:01:00.0  On |                  N/A |
|  0%   47C    P8             13W /  170W |    1516MiB /  12288MiB |      2%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A        22      G   /Xwayland                                   N/A      |
|    0   N/A  N/A        23      G   /Xwayland                                   N/A      |
|    0   N/A  N/A        31      G   /Xwayland                                   N/A      |
+-----------------------------------------------------------------------------------------+

現象:Pytorchからは認識できていないが、nvidia-smiは実行できる

試したこと

  1. NVIDIA Container ToolkitをWSLにインストール→NG
  2. Dockerイメージのベースとなっているpytorchイメージのバージョンを変える→OK

NVIDIA Container Toolkitのインストール

WSLの環境:Ubuntu 22.04

最初はこれをやっていなかったからだと思ったがそうではなかった。

もしかしたら2つ目の方法だけでOKだったかもしれないが一応メモしておく。

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

WSLを起動し、以下実行

$ 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/stable/deb/nvidia-container-toolkit.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
$ sudo sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
$ sudo apt update
$ sudo apt install -y nvidia-container-toolkit

以下実行して nvidia-smi のログが出ればインストールOK

$ docker run --rm --gpus all nvidia/cuda:12.3.1-base-ubuntu22.04 nvidia-smi
Unable to find image 'nvidia/cuda:12.3.1-base-ubuntu22.04' locally
12.3.1-base-ubuntu22.04: Pulling from nvidia/cuda
5e8117c0bd28: Pull complete
d67fcc6ef577: Pull complete
47ee674c5713: Pull complete
63daa0e64b30: Pull complete
d9d9aecefab5: Pull complete
Digest: sha256:6a7febf317514458233b87819ce47d5441357dd7763e91800c35f6745f34bbbd
Status: Downloaded newer image for nvidia/cuda:12.3.1-base-ubuntu22.04
Fri Feb 23 12:55:11 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.10              Driver Version: 551.61         CUDA Version: 12.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 RTX 3060        On  |   00000000:01:00.0  On |                  N/A |
|  0%   43C    P8             13W /  170W |    1846MiB /  12288MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A        23      G   /Xwayland                                   N/A      |
|    0   N/A  N/A        31      G   /Xwayland                                   N/A      |
+-----------------------------------------------------------------------------------------+

Dockerイメージのベースとなっているpytorchイメージのバージョンを変える

DockerイメージのCUDAのバージョンとnvidia-smiで出力されるCUDAのバージョンが違ったので、それが原因かと思いトライ

イメージのタグはこちらから探せる:

https://hub.docker.com/r/pytorch/pytorch/tags

直感で修正 cuda11.8をcuda12.1に変更

❯ git diff
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 7221ed3..f80c97d 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -13,7 +13,8 @@
 # limitations under the License.

 # Use PyTorch CUDA base image
-FROM pytorch/pytorch:2.1.2-cuda11.8-cudnn8-runtime
+FROM pytorch/pytorch:2.1.2-cuda12.1-cudnn8-runtime

 USER root

イメージをビルドしていたらリビルドする。

Discussion