高火力 DOKはコンテナー型のGPUサービスで、NVIDIA V100とかH100を実行時間課金で利用できるサービスです。
コンテナー型GPUクラウドサービス 高火力 DOK(ドック) | さくらインターネット
今回はこの高火力 DOKで、YuE(乐。音楽生成モデル) を試してみました。
参考
YuEを使って音楽生成を始めよう! 🎵を参考にさせてもらっています。
とりあえず試す
コンテナレジストリにプッシュ済みのイメージを使って実行してみたい方は、DOKにて新しいタスクを作成し、以下の情報を入力してください。
項目 | 設定 |
---|---|
イメージ | dok-handson.sakuracr.jp/yue |
環境変数 | LYRIC = https://raw.githubusercontent.com/multimodal-art-projection/YuE/refs/heads/main/prompt_egs/lyrics.txt GENRE = inspiring female uplifting pop airy vocal electronic bright vocal vocal |
LYRICは歌詞が書かれたファイル、GENREは生成する音楽の雰囲気を指定します。実行完了すると、MP3ファイルが生成されます。H100で15分7秒 (907 秒)かかりました。
コンテナイメージの作成と登録
上記タスクで利用したDockerイメージを作成する手順は以下の通りです。完成版はgoofmint/dok-yueにありますので、実装時の参考にしてください。
Dockerfile の作成
YuEを使って音楽生成を始めよう! 🎵の内容に沿って、Dockerfileを作成します。
ベースイメージ
ベースは FROM nvidia/cuda:12.5.1-devel-ubuntu22.04
です。
FROM nvidia/cuda:12.5.1-devel-ubuntu22.04
ライブラリのインストール
Pythonと、必要なライブラリをインストールします。
RUN apt-get update && \
apt-get install -y \
git \
git-lfs \
python3 \
python3-pip \
wget && \
mkdir /app /opt/artifact && \
apt-get clean && \
git lfs install && \
rm -rf /var/lib/apt/lists/*
リポジトリのクローンと依存ライブラリのインストール
multimodal-art-projection/YuE: YuE: Open Full-song Music Generation Foundation Model, something similar to Suno.ai but openをクローンして、依存ライブラリをインストールします。
WORKDIR /app
RUN git clone https://github.com/multimodal-art-projection/YuE.git yue
WORKDIR /app/yue
# 依存ライブラリのインストール
RUN pip install -r requirements.txt && \
pip install packaging && \
pip install flash-attn --no-build-isolation && \
pip uninstall -y protobuf && \
pip install protobuf==3.20.0 && \
pip install --upgrade tensorflow && \
pip install --upgrade transformers
WORKDIR /app/yue/inference
RUN git clone https://huggingface.co/m-a-p/xcodec_mini_infer
後は 後述する docker-entrypoint.sh
をコピーします。
WORKDIR /
COPY docker-entrypoint.sh /docker-entrypoint.sh
# 実行権限を付与
RUN chmod +x /docker-entrypoint.sh
# Dockerコンテナー起動時に実行するスクリプトを指定して実行
CMD ["/bin/bash", "/docker-entrypoint.sh"]
Dockerfile全体
Dockerfileの全体は以下の通りです。
FROM nvidia/cuda:12.5.1-devel-ubuntu22.04
ENV DEBIAN_FRONTEND=noninteractive
# ENV CUDA_HOME=/usr/local/cuda
# ENV PATH=${CUDA_HOME}/bin:${PATH}
# ENV LD_LIBRARY_PATH=${CUDA_HOME}/lib64:${LD_LIBRARY_PATH}
# 必要なパッケージのインストール
# /appはアプリのディレクトリ、/opt/artifactはアウトプット先のディレクトリ
RUN apt-get update && \
apt-get install -y \
git \
git-lfs \
python3 \
python3-pip \
wget && \
mkdir /app /opt/artifact && \
apt-get clean && \
git lfs install && \
rm -rf /var/lib/apt/lists/*
WORKDIR /app
RUN git clone https://github.com/multimodal-art-projection/YuE.git yue
WORKDIR /app/yue
# 依存ライブラリのインストール
RUN pip install -r requirements.txt && \
pip install packaging && \
pip install flash-attn --no-build-isolation && \
pip uninstall -y protobuf && \
pip install protobuf==3.20.0 && \
pip install --upgrade tensorflow && \
pip install --upgrade transformers
WORKDIR /app/yue/inference
RUN git clone https://huggingface.co/m-a-p/xcodec_mini_infer
WORKDIR /
COPY docker-entrypoint.sh /docker-entrypoint.sh
# 実行権限を付与
RUN chmod +x /docker-entrypoint.sh
# Dockerコンテナー起動時に実行するスクリプトを指定して実行
CMD ["/bin/bash", "/docker-entrypoint.sh"]
docker-entrypoint.sh の作成
docker-entrypoint.sh
はDockerコンテナー起動時に実行するスクリプトです。ここでは環境変数をチェックして、YuEが用意しているPythonスクリプトを実行します。
引数で歌詞とジャンルを受け取りますが、それぞれファイルとして保存してPythonスクリプトに渡しています。
#!/bin/bash
set -ue
shopt -s nullglob
export TZ=${TZ:-Asia/Tokyo}
# アウトプット先ディレクトリ(自動付与) /opt/artifact固定です
if [ -z "${SAKURA_ARTIFACT_DIR:-}" ]; then
echo "Environment variable SAKURA_ARTIFACT_DIR is not set" >&2
exit 1
fi
# DOKのタスクID(自動付与)
if [ -z "${SAKURA_TASK_ID:-}" ]; then
echo "Environment variable SAKURA_TASK_ID is not set" >&2
exit 1
fi
# 歌詞
if [ -z "${LYRIC:-}" ]; then
echo "Environment variable LYRIC is not set" >&2
exit 1
fi
if [ -z "${GENRE:-}" ]; then
echo "Environment variable GENRE is not set" >&2
exit 1
fi
# 歌詞とジャンルをファイルに保存
wget -O /app/yue/prompt_egs/lyrics.txt ${LYRIC}
echo "${GENRE}" > /app/yue/prompt_egs/genre.txt
pushd /app/yue/inference
python3 infer.py \
--cuda_idx 0 \
--stage1_model m-a-p/YuE-s1-7B-anneal-en-cot \
--stage2_model m-a-p/YuE-s2-1B-general \
--genre_txt ../prompt_egs/genre.txt \
--lyrics_txt ../prompt_egs/lyrics.txt \
--run_n_segments 2 \
--stage2_batch_size 4 \
--output_dir ../output \
--max_new_tokens 3000 \
--repetition_penalty 1.1
mv ../output/*.mp3 ${SAKURA_ARTIFACT_DIR}
popd
MP3ファイルは output
ディレクトリに保存されますので、DOKの保存ディレクトリである /opt/artifact
に移動します。
Dockerイメージのビルド
上記の内容で、Dockerイメージをビルドします。Linux環境などで行います。
コンテナレジストリの用意
Dockerイメージを登録するコンテナレジストリを作成します。さくらのクラウドではLAB機能で、コンテナレジストリを提供しています。さくらのクラウドにログインしたら さくらのクラウド
を選択します。
左側のメニューの LAB
の中にある コンテナレジストリ
を選択します。
追加
を押して、コンテナレジストリを作成します。最低限、以下の入力が必要です。
項目 | 設定 |
---|---|
名前 | 分かりやすい、任意の名前を入力してください |
コンテナレジストリ名 | ドメイン名に使われます。以下では、 EXAMPLE.sakuracr.jp として説明します |
公開設定 | Pullのみとします |
ユーザーの作成
コンテナレジストリを作成したら、作成したコンテナレジストリを一覧でダブルクリックします。
詳細表示にて、ユーザータブをクリックします。
追加ボタンを押し、ユーザーを作成します。 YOUR_USER_NAME
と PASSWORD
は任意のものを指定してください。
項目 | 設定 |
---|---|
ユーザー名 | YOUR_USER_NAME |
パスワード | YOUR_PASSWORD |
ユーザ権限設定 | All |
Dockerイメージのビルド
DockerイメージはLinuxで行います。今回はUbuntu 24.04を使っています。Dockerが使える環境であれば、Windows + WSL2でも問題ありません。macOSの場合、アーキテクチャが異なるので動かせないかも知れません(未検証です)。
EXAMPLE.sakuracr.jp
の部分は、作成したコンテナレジストリのドメイン名に置き換えてください。また、 animagine
は任意の名前で大丈夫です(以下はその名称で読み替えてください)。
sudo docker build -t EXAMPLE.sakuracr.jp/animagine:latest .
コンテナレジストリへのログイン
作成したコンテナレジストリにログインします。ログインIDとパスワードが求められるので、作成したものを入力してください。
sudo docker login EXAMPLE.sakuracr.jp
イメージのプッシュ
作成したイメージをコンテナレジストリにプッシュします。イメージサイズが大きいので、数十分かかります。
sudo docker push EXAMPLE.sakuracr.jp/animagine:latest
タスクを作成する
後は最初と同じようにDOKでタスクを作成、実行します。
項目 | 設定 |
---|---|
イメージ | dok-handson.sakuracr.jp/yue |
環境変数 | LYRIC = https://raw.githubusercontent.com/multimodal-art-projection/YuE/refs/heads/main/prompt_egs/lyrics.txt GENRE = inspiring female uplifting pop airy vocal electronic bright vocal vocal |
実行が完了し、MP3ファイルが生成できていれば成功です。
まとめ
今回はYuEを使って、DOK上で音楽生成を行いました。まずは実行できるのみ、次にDockerイメージの作成と段階的に進められるようにしています。音楽生成のように、処理に時間がかかるものを利用する際にDOKは便利です。
高火力 DOKはタスクを多数立ち上げて、後は結果を待つのみと言った使い方ができます。ぜひAI・機械学習に活用してください。