🤕

WindowsにPython+CUDA+PyTorch+TransformersでLLM実行環境を構築したら色々大変だった

2023/11/29に公開

会社にGPU搭載ノートがあったので、DL用マシンにすべく、素人が環境構築を試みました。
たくさん躓いたので後学の為に記録しておきます。

はじめに

目指す姿

  • Pytorch + GPU実行環境を構築
  • TransformersライブラリでLLMを実行
  • 低スペックGPUでも動く環境(LLMモデル量子化)

マシンスペック

  • Windows 10 Pro
  • RAM 32GB
  • GPU NVIDIA Quadro P3200 (VRAM 6GB)

環境構築つまづきポイント

  • GPUスペック、CUDAとPytorchのバージョン問題
  • CUDA環境変数の設定
  • Pythonバージョン問題
  • 社内のProxy環境・SSL認証の設定
  • Windows非対応ライブラリのインストール

インストールしたもの

太字部分が今回特に悩まされた箇所😟

  • Python 3.11.6
  • Visual Studio Code 1.84.1
  • Build Tools for Visual Studio
  • NVIDIAドライバ
  • CUDA Toolkit 11.8
  • cuDNN v8.9.6 for CUDA 11.x
  • Rust
  • Pythonライブラリ(主なもの):PyTorch, Transformers, Tokenizers, bitsandbytes

構築手順(2023年11月28日時点)

1. Pythonインストール

Python 3.11.5 をインストール
https://www.python.org/downloads/windows/

2. Visual Studio Codeインストール

いつも使う開発環境なのでインストール
https://code.visualstudio.com/

3. venv仮想環境作成

python -m venv envname

.\envname\Scripts\activate

4. Build Tools for Visual Studio インストール

後述するCUDA ToolkitとRustのインストールに必要なC++コンパイラを入れる為、以下サイトからVisual Studio Installerをダウンロードして実行。

https://visualstudio.microsoft.com/ja/downloads/

「C++によるデスクトップ開発」をインストール↓

5. NVIDIAドライバ最新化

対象GPUを選択して最新ドライバをダウンロード
https://www.nvidia.co.jp/Download/index.aspx?lang=jp

インストール後、コマンドプロンプトでnvidia-smiと実行し、CUDAバージョンを確認。
バージョンは12.2でした。

> nvidia-smi
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 537.70                 Driver Version: 537.70       CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                     TCC/WDDM  | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  Quadro P3200                 WDDM  | 00000000:01:00.0 Off |                  N/A |
| N/A    0C    P0              28W /  88W |      0MiB /  6144MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+

6. CUDA Toolkit 11.8 インストール+環境変数の設定

以下から対象のCUDAバージョンを選択してインストーラを入手。
https://developer.nvidia.com/cuda-toolkit-archive

色々迷って今回はバージョン11.8をインストール
理由はPytorch + CUDA 12だと動かないとの記事を見かけた事、最新版よりは実績版の方が安心に思えた事、CUDA 11~12は下位互換性があると知った事などによります。

インストール後、システム環境変数とユーザ環境変数を設定します
システム環境変数に追加
CUDA_PATH, C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8
CUDA_PATH_V11_8, C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8

ユーザ環境変数のPathに追加
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\libnvvp

最終的にコマンドプロンプトでnvcc -Vコマンドが通る事を確認します

7. cuDNN v8.9.6 for CUDA 11.x ダウンロード+環境変数設定

これも公式からCUDAバージョン(v11.x)を選択しつつダウンロードします
この際、NVIDIAアカウントが必要との事で、少し面倒ですが登録します
https://developer.nvidia.com/rdp/cudnn-download

ダウンロードしたZIPを解凍後、そのフォルダにもシステム環境変数CUDNN_PATHを通すのですが、CUDA_PATHと同じ階層の
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8
に解凍したフォルダを丸コピし、そこに対してパスを通すのがシンプルです

システム環境変数に追加
CUDNN_PATH, C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8

8. PyTorchインストール(w/プロキシ・SSL認証設定)

PyTorch公式よりpip文を生成。
https://pytorch.org/

Python仮想環境上でインストールします

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

この際、冒頭で触れたように、今回は会社で使っておりプロキシ環境下にある事とSSL認証を通す必要があります。
pip install時に毎回必要になるため、以下のようにpip.iniファイルを作成し、
C:¥Users¥{UserName}¥AppData¥Roaming¥pip¥pip.ini
に置いておきます。

pip.ini
[global]
trusted-host =
 pypi.python.org
 pypi.org
 files.pythonhosted.org
 download.pytorch.org
proxy = http://<IPアドレス>:<Port番号>

trusted_hostでSSLErrorを、proxyでプロキシエラーを解消できるはずです。
trusted_hostは通常のpip install {ライブラリ名}であればpypi.python.orgとpypi.orgで大丈夫ですが、ライブラリによって別のリポジトリからインストールする必要があった際には追加しています(今回もPytorchがそうでした)

9. Rustのインストール

PythonでライブラリTransformersをインストールする際に、依存ライブラリであるTokenizersのインストールでエラーが発生しました。

Collecting tokenizers<0.19,>=0.14 (from transformers)
  Using cached tokenizers-0.15.0.tar.gz (318 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... error
  error: subprocess-exited-with-error

  × Preparing metadata (pyproject.toml) did not run successfully.
  │ exit code: 1
  ?─> [8 lines of output]
      error: rustup could not choose a version of cargo to run, because one wasn't specified explicitly, and no default is configured.
      help: run 'rustup default stable' to download the latest stable release of Rust and set it as your default toolchain.
     
      Cargo, the Rust package manager, is not installed or is not on PATH.
      This package requires Rust and Cargo to compile extensions. Install it through
      the system's package manager or via https://rustup.rs/
     
      Checking for Rust toolchain....
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
?─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.

「This package requires Rust and Cargo to compile extensions.」と言うことで、Rustを入れる必要があるようでした。
以下から64bit版を選択し、rustup-init.exeをダウンロード&実行するとCLI上でインストールが始まります
https://www.rust-lang.org/ja/tools/install

最初、defaultでインストールを試みると「toolchainのstable版が無い」だなんだとエラーが発生しました。
2)Customize Installationでtoolchain noneなど(うろ覚え)を選択してインストール。
その後改めて

set HTTPS_PROXY=http://<IPアドレス>:<Port番号>
rustup default stable

と実行することで何とかちゃんとインストールできたっぽい(この辺全然理解してないです)
(上記コマンドの1行目はコマンドプロンプト上でプロキシを通す為に実行してます)

ここまで何とか辿り着いたものの、pip install tokenizersは相変わらずエラー・・・
そこでようやくしくじりポイント① のPythonバージョン問題に気付き、Pythonを再インストールする羽目に。

10. Transformers関係ライブラリのインストール

あと一息!
と言うことで、LLM実行環境に必要な各種ライブラリをインストール
tokenizerも含めてエラー無く完了!!😂

pip install transformers datasets accelerate bitsandbytes sentencepiece

11. bitsandbytesのインストール

bitsandbytesがWindows非対応の為、pip installは出来ますが、import時にうまく行きません。
Windows対応方法を調べると幾つか手段がありそうで大変迷ったのですが、最終的には以下サイトのやり方で無事にインストール&実行出来ました
https://qiita.com/selllous/items/c4880767da45173227c1

pip install https://github.com/jllllll/bitsandbytes-windows-webui/raw/main/bitsandbytes-0.39.0-py3-none-any.whl

import bitsandbytes

この際もpip.iniにてSSLError対策を行いました。
また、しくじりポイント② に書いた環境変数設定も行わないとCUDAが見つからない的なエラーが出てしまいました。

ユーザ環境変数のPathに追加
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\libnvvp

ご注意を!
これでやっと所望の環境が作れました!!

最後に

以上、書き順がごちゃごちゃしてますが、今回の構築手順を多少整理しつつ記載しました。
普段はGoogle Colabなどでお気軽にDLを活用していますが、自分で作るとこんなにも大変なんですね・・・

とりわけ、

  • tokenizersのインストール時にRustが必要なこととPython<=3.11が必要なこと
  • bitsandbytesのインストール時にWindows対応版が必要なこととCUDA環境変数が必要なこと

などと複合的なエラーに幾度も悩まされて数日間を溶かしてしまいました。

ここまでして準備した環境が少しでも業務に活きますように。アーメン🙏

Discussion