先日、今まで使えていたAudioCraft(MusicGen)が以下のエラーで起動しなくなりました。
Preparing metadata (setup.py) … error
error: subprocess-exited-with-error
× python setup.py egg_info did not run successfully.
│ exit code: 1
╰─> [9 lines of output]
No CUDA runtime is found, using CUDA_HOME=’C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8′
Traceback (most recent call last):
File “”, line 2, in
File “”, line 34, in
File “C:\Users\minok\AppData\Local\Temp\pip-install-jutczj_m\xformers_7556bee2c41042458481e5ebb4b54959\setup.py”, line 239, in
ext_modules=get_extensions(),
File “C:\Users\minok\AppData\Local\Temp\pip-install-jutczj_m\xformers_7556bee2c41042458481e5ebb4b54959\setup.py”, line 157, in get_extensions
raise RuntimeError(
RuntimeError: CUTLASS submodule not found. Did you forget to run git submodule update –init –recursive ?
[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.
この環境は、Pythonの仮想環境で作成していました。
公式サイトを確認してみると、ページの内容が変わり、pythonのバージョンは3.9が推奨され、以前の3.10ではないようです。
これを解決するには、推奨されるバージョンをインストールすればいいのですが、このバージョンでは動作しなくなるプログラムもあるので困りました。複数のpythonのバージョンをインストールして、切り替えて使う手もあるようですが、Dockerで実現することにします。推奨されるバージョンのイメージを使用すればこの問題は解決します。CUDAのバージョンがホストと異なっていても動作します。Dockerを使用するメリットは他にもあります。
- 環境の再現性: Dockerコンテナは、依存関係とアプリケーションの環境をコードで定義できるため、環境の再現性が高まります。これにより、異なるマシンやチームメンバー間で環境を簡単に共有し、同じ条件でコードを実行できます。
- 環境の分離: Dockerコンテナはホストシステムから分離されているため、異なるプロジェクトやタスクで異なる環境を維持することが簡単になります。これにより、依存関係の衝突やバージョンの問題を避けることができます。
- ポータビリティ: Dockerコンテナは、異なるオペレーティングシステムやクラウドプラットフォーム間で簡単に移動できます。これにより、アプリケーションのデプロイとスケーリングが簡単になります。
- 効率と速度: Dockerコンテナは軽量で、高速に起動できます。これにより、デプロイメント、テスト、および継続的インテグレーション/継続的デリバリー(CI/CD)パイプラインの効率が向上します。
- バージョン管理: Dockerイメージはバージョン管理されており、異なるバージョンのアプリケーションや環境を簡単にトラック、ロールバック、および管理できます。
- リソースの効率的な利用: Dockerは、リソースを効率的に共有し、利用することができるため、ホストマシンのリソースをより効率的に利用できます。
- 開発とデプロイの簡素化: Dockerを使用すると、開発、テスト、およびプロダクション環境間でのアプリケーションの移動が簡単になります。これにより、デプロイメントプロセスが簡素化され、エラーが減少します。
- コミュニティとエコシステム: Dockerには活発なコミュニティと広範なエコシステムがあり、多くの準備済みのDockerイメージ、Docker Composeテンプレート、および他のリソースが利用可能です。
というわけで、WindowsのWSLを起動して、Dockerをインストールしておきます。
管理しやすくするために、適当なディレクトリを作成します。
mkdir audio
作成した空のディレクトリに移動して、Dockerfileを作成します。
cd audio
sudo vi Dockerfile
Dockerfileの記述内容は以下になります。色々トラブルに遭遇しましたが、この内容で動作しました。
# ベースイメージを指定
FROM python:3.9-slim-buster
# 必要なパッケージをインストール
RUN apt-get update && \
apt-get install -y git ffmpeg && \
pip install torch==2.0.0+cu118 torchvision==0.15.1+cu118 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu118
# AudioCraftのリポジトリをクローン
RUN git clone https://github.com/facebookresearch/audiocraft /usr/src/app
# 作業ディレクトリを設定
WORKDIR /usr/src/app
# AudioCraftをインストール
RUN pip install -U .
# サーバーを起動
CMD ["python", "./demos/musicgen_app.py", "--listen", "0.0.0.0", "--server_port", "7860"]
しかし、ホストのCUDAのバージョンを12.4にしたのでファイルの内容を書き換えます。GitHubのrequirements.txtを見て修正します。なおコンテナ内はCUDA12.1です。こちらのファイルはClaude3.5 Sonnetの力を借りて作成しました。
# ベースイメージを指定
FROM python:3.9-slim-buster
# 必要なシステムパッケージをインストール
RUN apt-get update && \
apt-get install -y \
git \
ffmpeg \
build-essential \
gfortran \
libopenblas-dev \
liblapack-dev \
python3-distutils \
python3-dev \
python3-setuptools \
python3-pip \
libsndfile1 \
pkg-config \
python3-venv \
python3-distutils-extra && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Pythonパッケージのアップグレード
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel
# 仮想環境を作成して有効化
ENV VIRTUAL_ENV=/opt/venv
RUN python -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
# システムのdistutilsを使用するように設定
ENV SETUPTOOLS_USE_DISTUTILS=stdlib
# 基本的な依存関係を分割してインストール
RUN pip install --no-cache-dir "wheel>=0.38.4"
RUN pip install --no-cache-dir "setuptools>=66.0.0"
RUN pip install --no-cache-dir "cython>=0.29.33"
RUN pip install --no-cache-dir "pybind11>=2.10.3"
# numpyを特定のバージョンでインストール
RUN pip install --no-cache-dir "numpy==1.23.5"
# PyTorch関連のインストール(CUDA 12.1)
RUN pip install --no-cache-dir \
torch==2.1.0+cu121 \
torchaudio==2.1.0+cu121 \
torchvision==0.16.0+cu121 \
torchtext==0.16.0 \
--index-url https://download.pytorch.org/whl/cu121
# その他の依存関係を分割してインストール
RUN pip install --no-cache-dir \
"av==11.0.0" \
"einops" \
"flashy>=0.0.1" \
"hydra-core>=1.1" \
"hydra_colorlog" \
"julius"
RUN pip install --no-cache-dir \
"num2words" \
"sentencepiece" \
"spacy>=3.6.1" \
"huggingface_hub" \
"tqdm" \
"transformers>=4.31.0"
RUN pip install --no-cache-dir \
"xformers<0.0.23" \
"demucs" \
"librosa" \
"soundfile" \
"gradio"
RUN pip install --no-cache-dir \
"torchmetrics" \
"encodec" \
"protobuf" \
"pesq" \
"pystoi"
# AudioCraftのリポジトリをクローン
RUN git clone https://github.com/facebookresearch/audiocraft /usr/src/app
# 作業ディレクトリを設定
WORKDIR /usr/src/app
# AudioCraftをインストール(依存関係の解決に--no-dependenciesを使用)
RUN pip install --no-dependencies -e .
# サーバーを起動
CMD ["python", "./demos/musicgen_app.py", "--listen", "0.0.0.0", "--server_port", "7860"]
そして以下はコンテナ内でもCUDAのバージョンは12.4です。しかし、CUDA12.4用のDockerfileでビルドしているときダウンロードしているのを観察していると12.1が付くものが多々ありました。
# ベースイメージを指定
FROM python:3.9-slim-buster
# 必要なシステムパッケージをインストール
RUN apt-get update && \
apt-get install -y \
git \
ffmpeg \
build-essential \
gfortran \
libopenblas-dev \
liblapack-dev \
python3-distutils \
python3-dev \
python3-setuptools \
python3-pip \
libsndfile1 \
pkg-config \
python3-venv \
python3-distutils-extra && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Pythonパッケージのアップグレード
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel
# 仮想環境を作成して有効化
ENV VIRTUAL_ENV=/opt/venv
RUN python -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
# システムのdistutilsを使用するように設定
ENV SETUPTOOLS_USE_DISTUTILS=stdlib
# 基本的な依存関係を分割してインストール
RUN pip install --no-cache-dir "wheel>=0.38.4"
RUN pip install --no-cache-dir "setuptools>=66.0.0"
RUN pip install --no-cache-dir "cython>=0.29.33"
RUN pip install --no-cache-dir "pybind11>=2.10.3"
# numpyを特定のバージョンでインストール
RUN pip install --no-cache-dir "numpy==1.23.5"
# PyTorch関連のインストール
RUN pip install --no-cache-dir \
torch==2.4.0+cu124 \
torchvision==0.19.0+cu124 \
torchaudio==2.4.0+cu124 \
--index-url https://download.pytorch.org/whl/cu124
RUN pip install --no-cache-dir torchtext==0.17.0
# transformersを先にインストール
RUN pip install --no-cache-dir "transformers==4.31.0"
# その他の依存関係を分割してインストール
RUN pip install --no-cache-dir \
"av==11.0.0" \
"einops" \
"flashy>=0.0.1" \
"hydra-core>=1.1" \
"hydra_colorlog" \
"julius"
RUN pip install --no-cache-dir \
"num2words" \
"sentencepiece" \
"spacy>=3.6.1" \
"huggingface_hub" \
"tqdm"
RUN pip install --no-cache-dir \
"xformers==0.0.22" \
"demucs" \
"librosa" \
"soundfile" \
"gradio"
RUN pip install --no-cache-dir \
"torchmetrics" \
"encodec" \
"protobuf" \
"pesq" \
"pystoi"
# AudioCraftのリポジトリをクローン
RUN git clone https://github.com/facebookresearch/audiocraft /usr/src/app
# 作業ディレクトリを設定
WORKDIR /usr/src/app
# AudioCraftをインストール(依存関係の解決に--no-dependenciesを使用)
RUN pip install --no-dependencies -e .
# サーバーを起動
CMD ["python", "./demos/musicgen_app.py", "--listen", "0.0.0.0", "--server_port", "7860"]
CUDA 12.4用のDockerfileでビルドしている際に、一部のパッケージが依然としてCUDA 12.1用のバージョンをダウンロードしているのは、以下の理由によるものです。
- 依存関係のバージョン互換性
- 多くのディープラーニングライブラリは、直接的な依存関係として特定のCUDAバージョンのPyTorchを要求します
- 例えば、xformersやその他のライブラリが内部で
torch==2.1.0+cu121
を要求する可能性があります
- バイナリの互換性
- CUDA 12.4のバイナリは比較的新しく、全てのライブラリがまだ対応していません
- 多くのライブラリは安定版としてCUDA 12.1のバイナリを提供しています
- CUDA 12.4は12.1とのバイナリ互換性を持っているため、12.1用のバイナリも問題なく動作します
- 安定性の考慮
- CUDA 12.1は広く使用されており、十分にテストされています
- 多くのライブラリがCUDA 12.1で公式にテストを行っています
解決策として以下のアプローチが考えられます。
- 明示的なバージョン指定
# 特定のバージョンを明示的に指定
RUN pip install --no-cache-dir \
torch==2.4.0+cu124 \
--index-url https://download.pytorch.org/whl/cu124 \
--no-deps
- 依存関係の整理
# 依存関係を個別にインストールして競合を避ける
RUN pip install --no-cache-dir \
packageA==version \
--no-deps
- 環境変数の設定
# CUDAバージョンを環境変数で指定
ENV CUDA_VERSION=12.4
ENV TORCH_CUDA_ARCH_LIST="8.0;8.6;8.9"
ただし、現時点では以下の理由により、一部のパッケージがCUDA 12.1のバイナリを使用することは許容される状態です。
- CUDA 12.4は12.1との下位互換性があります
- パフォーマンスへの影響は最小限です
- システムの安定性が確保されます
将来的には、より多くのライブラリがCUDA 12.4に完全対応し、純粋なCUDA 12.4環境を構築できるようになると予想されます。
作成したDockerfileを元にDockerイメージをビルドします。
docker build -t audiocraft .
次に、コンテナを実行します。
docker run -d --name audio -p 7860:7860 audiocraft
WSLのIPアドレスを確認します。
ip a
IPアドレスを確認したら、ブラウザでアクセスします。
http://IPアドレス:7860
DockerでGPUを利用するためには、NVIDIA Container Toolkitをインストールしておきます。
正しくインストールしてあると以下のコマンドで情報が表示されます。
nvidia-container-cli info
mamushi@n4060:~/audio$ nvidia-container-cli info
NVRM version: 537.42
CUDA version: 12.2
Device Index: 0
Device Minor: 0
Model: NVIDIA GeForce RTX 4060 Laptop GPU
Brand: GeForce
GPU UUID: GPU-73f6ad9a-b926-49a8-5fbb-ce9cb487757b
Bus Location: 00000000:01:00.0
Architecture: 8.9
先のdocker runコマンドではCPUを使用するので、一度コンテナを停止して削除します。
docker stop audio
docker rm audio
下記のコマンドでコンテナを起動します。
docker run --name audio --gpus all -p 7860:7860 -d audiocraft
ブラウザのWeb UIで曲作成中に、GPUの使用状況を確認します。
nvidia-smi
nvidia-smi
コマンドを使用することで、WSL上から直接GPUの状態と使用状況を確認することができます。これにより、次のような詳細な情報を得ることができます:
- GPUの基本情報: GPUの名前、ID、およびドライババージョンなどの基本情報を確認できます。
- GPU利用状況: GPUの利用率、メモリ使用率、およびその他のリソース使用状況を確認できます。
- 実行中のプロセス: GPU上で実行中のプロセスとそれらのプロセスが消費するGPUリソースの量を確認できます。
- 温度と電力: GPUの温度や電力消費を確認できます。
- エラーと警告: GPU関連のエラーや警告を確認できます。
これらの情報は、GPUのパフォーマンスと健康状態をモニタリングし、トラブルシューティングを行うのに非常に有用です。また、nvidia-smi
コマンドはリアルタイムで更新されるため、リアルタイムのフィードバックを提供し、GPUの動作をより正確に把握することができます。
一方、Windowsのタスクマネージャは、基本的なGPU利用状況とメモリ使用状況を提供するだけであり、nvidia-smi
ほど詳細な情報は提供しません。したがって、より詳細なGPUの状態と使用状況の情報が必要な場合には、nvidia-smi
コマンドを使用することが推奨されます。