はじめに
こんにちは、レコチョクの海津です。
Maker Faire Tokyo2024に出展した
カメレオンノーツという作品の開発に携わりました。
この作品で使われている作曲AIを動かすための環境構築について記載します。
前提
- 作曲AI:Meta社のMusicGen(AudioCraft)
- サーバー:AWSのEC2(GPUインスタンス)
を利用します。
自分で環境構築
会社の基本ルールとして、EC2のAMIは会社の基盤チームで作られているAMIを使用します。
なのでまずはルールに則り、会社で共有されているAMIを使い一から環境構築をはじめてみました。
またGPUインスタンスはインスタンスサイズの最小がxlargeでコストが高いため、少しでもコスト削減しようとARMインスタンスを検討しました。
なので以下環境で構築をはじめました。
- AMI:会社のAMI(OSはAmazon Linux 2)
- インスタンスタイプ:g5g.xlarge
audiocraftはPython3.8以上が必要になったため、まずはpyenvのインストールを行いました。
ここでgccが必要になりインストールしてみると、kernel-headersがないというエラーが出てしまいました。
$ sudo yum install gcc ... エラー: パッケージ: glibc-headers-2.26-64.amzn2.0.3.aarch64 (amzn2-core) 要求: kernel-headers |
なのでkernel-headersをインストールしようとしましたが、yumに用意されておらず。。。
$ sudo yum list kernel-headers ... エラー: 表示するパッケージはありません |
直接インストールすることで回避できました。
$ wget http://buildlogs-seed.centos.org/c7-kernels.aarch64/kernel/20201021171654/5.4.72-200.el7.aarch64/kernel-headers-5.4.72-200.el7.aarch64.rpm $ rpm -ivh kernel-headers-5.4.72-200.el7.aarch64.rpm |
しかしさらにNvidiaのCUDA周りの設定がうまくいかなかったり色々つまずいたため、初心に帰ってx86_64インスタンスで構築することにしてみました。
楽に環境構築
x86_64インスタンスでの構築。
ここでGPU周りの設定がしてあるAMIがあることに気づき、今回はお願いしてそちらを使用しました。
以下環境で構築しました。
- AMI:Deep Learning OSS Nvidia Driver AMI GPU PyTorch 2.3.0 (Ubuntu 20.04)
- インスタンスタイプ:g5.xlarge
今回の環境ではPythonのバージョンは問題なくそのまま使えました。
まずはaudiocraftのインストールを行いました。
$ pip install audiocraft |
次に、audiocraftがnumpy2系だと動かないようなので、numpy1系をインストールしています。
$ pip install numpy==1.26.4 |
動作確認のため、作曲AIモデルを使って簡単な音楽を作成してみます。
このコードはカメレオンノーツの実装の処理をかなり簡略化したものになります。
from audiocraft.models import MusicGen from audiocraft.data.audio import audio_write model = MusicGen.get_pretrained("small", device="cuda") model.set_generation_params(duration=30) wav = model.generate("prompt", progress=True)[0] audio_write("file_name", wav.cpu(), model.sample_rate) |
無事動作!
起動時間の設定
ずっと動かす必要もなく少しでもコスト削減するために、起動時間を設定しておきました。
Amazon EventBridge Schedulerを使用したら簡単にできました。
以下の流れで設定しました。
- AWSコンソールでAmazon EventBridge Schedulerに移動し、スケジュールの作成を選択する
- 月曜〜金曜の10時に起動するように定期的なスケジュールを選びパターンを設定
- cronベースのスケジュールを選択、cron式は 0 10 ? * Mon-Fri *
- 直近10個のトリガー日が出てくれるので確認する
- ターゲットはAmazon EC2のStartInstanceを選択
- パラメータに作成したインスタンスのインスタンスIDを指定
- スケジュール完了後のアクションはNONEを指定しておく
- 実行ロールは以下のようなロールを作成しアタッチ
- 許可ポリシーはAmazonEC2FullAccess
- 信頼ポリシーは以下に記載
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "scheduler.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } |
- 設定した内容を確認しスケジュールを作成する
停止も同じ流れで設定しておきます。
まとめ
GPUを利用するのに色々つまずいた話でした。
最後はあっさりできましたが、色々試してみるのは知見がついて大事ですね。
この記事を書いた人

最近書いた記事
2025.02.20作曲AIを動かす環境構築
2019.10.11Pythonのアンパックとタプル
2019.01.22JavaScript側でsubmitができない
2018.12.13「AWS Toolkit for PyCharm について」~ RecoChoku Tech Night #09 4社合同 AWS re:Invent参加レポート で登壇しました ~