はじめに
本記事では、かれこれ10台以上のAI / Deep learning開発向けの環境構築を行ってきた著者が、経験上ハマるポイントをまとめました。
(最初に構築した環境は、今は利用者がほぼいないであろう、CaffeとChainer向けでした。)
以下の想定読者向けに作成しましたので、お役に立てれば嬉しいです。
- 機械学習や深層学習などのDeep learning 開発環境を構築しようとしている方
- KerasやPytorchなどのAIフレームワーク向けの開発環境を構築しようとしている方
- 開発環境構築時に詰まってしまった方
各種ハードウェアやソフトウェアの改善により、本内容が古くなる可能性があります。
本内容は著者の経験をベースに記述しています。
目次
ハードウェア編
GPU
GPUは言わずもがな、AI開発環境を構築するうえで、最も重要なパーツです。
NVIDIA GeForceシリーズのGPUを買っておけば問題ないです。
AI開発を行う = NVIDIA CUDAを使うことになります。
AMD製のGPUは買ったことも使ったこともないので、わかりません。
選定の上でのポイントは以下です。
- ポイント1. 動作させたいソフトウェアに合わせたGPUを選択する
- ポイント2. GPUメモリ容量を優先して選択する
- ポイント3. GPUのサイズを確認する
ポイント1. 動作させたいソフトウェアに合わせたGPUを選択する
動作させたいソフトウェアに対して、GPUを選択することが重要です。
画像認識向けの学習・推論を行いたいのか、LLMの推論を行いたいのか、用途は様々です。
動作させたいソフトウェアが要求するCUDAのバージョンも見ておいた方が良いです。
GPUの型番で動作できるCUDAのバージョンは決まっているので、事前に確認しておきましょう。
ポイント2. GPUメモリ容量を優先して選択する
GPU メモリがなるべく多いものを選ぶのが良いです。
AIの学習・推論にてはデータをGPU側のメモリに格納するため、その容量によって可能な処理が大きく変わります。
実際に環境構築後の使用感から、ランク帯を下げてでも、GPUメモリがなるべく大きい物を選ぶべきです。
逆に、ランク帯を上げても少し学習が早くなるぐらいで、効果は薄いです。(結局、夜通し、あるいは数日かけて)
ポイント3. GPUのサイズを確認する
年々、GPUのサイズは大きくなっているので、注意が必要です。
私が最初に触ったNVIDIA GTX780ぐらいだったので、現在のRTX4080は2, 3倍ぐらい大きくなっている感覚です。
CPU
初心者の方は無難?にIntel製のCPUを購入することをおすすめします。
以前は、NVIDIA GPU x AMD CPUの相性の悪さをよく聞くこともありましたが、現在はそんなことはないのかなと考えています。
一方で、初めてNVIDIA GPU x AMD CPUを組む際に、苦戦したケースは身近でも数例ありました。
ただでさえややこしいGPU環境構築において、不安要素はなるべく排除したいです。
トラブル時のドキュメントもそこまで多くありません。
そして、予算がなければCPUはケチるポイントになると思います。
AI開発において、重要なのはGPU性能であり、CPU性能は削っても問題ない部分です。
Intel Core i5シリーズなどで問題ありません。
メモリ
なるべく容量を積んでおきましょう。
AIの学習を行う際に、GPUに転送する領域は一時的にCPUメモリに保持されます。
そのため、プログラムでの領域確保等を考えると、なるべく容量を積んでおくと良いと思います。
また、学習結果・推論結果を一時的にCPUメモリに保持することを考えると、容量は確保しておきたいです。
今後の拡張性も考え、1枚16GB以上のメモリから始めておくのが吉です。
(標準的な4スロットで、64GBは確保できる目論見)
PCケース
取り敢えず、大きいサイズのケースを選んでおくのが吉です。
ポイント1. PC内の空気循環を考慮する
空間に余裕があったほうが、PC内の空気循環が良くなり、GPUを温度を効率的に下げることができます。
PCケースギチギチにパーツを詰め込んだせいで、CPUやGPUの温度が下がらなくなり、パフォーマンスが意図的に制限されるパターンを何回か見てきました。
ポイント2. GPUを搭載するためのスペースを開けておく
GPUは年々大型化してきていますし、複数枚刺したくなることがあります。
また、GPUを入れ替えるのに伴って、電源や冷却装置の大型化が伴うことがあります。
マザーボード
NVIDIA SLIに対応したモデルが良いです。
NVIDIAのGPUを複数枚刺したうえで、GPU間で処理のやりとりをするものです。
SLI2対応していないと、GPUは複数枚刺せるものの、処理が共有できないです。
GPUの重さを支えられるPCIeソケット搭載のものが良いです。
VGAサポートステイがあることは前提なものの、
PCIeソケットがGPUの重さに耐えられず、使えなくなった例は何度か経験があります。
補助記憶
2TBのSSD一択です。
OSをインストールする先は、アクセス速度が確保できるSSDがおすすめです。
M.2 or SATAはお好みで選択ください。
容量は初心者は2TBまでにすることをおすすめします。
Ubuntuでは「2TBの壁」が存在し、2TB以上の補助記憶を認識させるためには工夫が必要になります。
無難に使用でき、データを沢山保存できる2TBをおすすめします。
前提知識ですが、HDDは2TBの壁が存在します。HDDは、MBR(Master Boot Record)形式を用いて、パーティション(領域)をセクター単位で管理しています。
通常のHDDは、セクターサイズが512Byteであり、パーティション内のセクター開始位置とセクター数の管理には4Byte(32bit)を使用します。
この制約によって、「最大2TB(アクセスできるセクター数×セクターサイズ = 2の32乗×512)」までしか管理できません。
参照元:gdisk/mkfsコマンドで2TB以上の大容量HDDをフォーマットする方法
電源
なるべく消費電力 W数に余裕があり、GPUに必要なピン数を提供できるものを選びましょう。
AI向けのPCではGPUの消費電力が支配的です。
GPUの消費電力から、必要となる電源のW数を算出するのが良いです。
後々、GPUを増設したくなったりするので、電源は予算と睨めっこしながら、余裕をもたせるのが吉です。
冷却装置
なるべく冷えるような仕組みを組んでおきましょう。
AI学習ではPCには大きな負荷をかけます。
自作で組んだ際に、冷却に関する仕組みが悪かったのか、PCのパフォーマンスが上がらなかった例を多々見てきました。
CPUクーラーは強力なものを選ぶことはもちろん、冷却性能の高いPCケース、熱効率の良いパーツ配置をおすすめします。
VGAサポートステイ
必ず装着してください。
GPUは年々巨大化してきており、その重さも1kgを超える物も出てきました。
VGAサポートステイなしで、PCIeスロットやGPUの接続部が破損した例があります。
PCは移動させることも度々あるので、安全に補強することをおすすめします。
ネットワークインターフェイス
Intelのギガビットイーサネットの有線接続をおすすめします。
Ubuntuの初期構築では、ネットワーク構築に工数を要する場合があります。
Intel製のネットワークアダプタに関しては、先人たちが沢山の失敗とドキュメントをネットに上げてくれているので、問題解決までの時間が早いです。
個人的にはRealtek製のネットワークカードはおすすめしません。
公式HPにてLinux用のドライバがリンク切れで配布されていなかったりと、サポートが不十分なケースがありました。
PCIeでの追加ネットワークでの構築は、接続優先度の設定等が必要な場合があるので、最初は避けたほうが良いと思います。
WiFiでの構築はわかりません、やったことがありません。
ディスクドライブ
不要です。USBインストーラーで十分間に合います。
その他
なるべく光るパーツは避けたほうが良いです。
AI開発では夜通し学習を回したりすることがあるので、目障りです。
設定等で変更できますが、不要なものは最初から避けておきましょう。
定番から外れるパーツは初心者の方は避けた方が良いと思います。
相性問題等で、何が原因かわからず、原因特定に時間を要することは多々あります。
ソフトウェア編
Ubuntu インストール
最新版のLTSを導入すればよいと思います。
ただし、困ったときのドキュメント探しやバージョン対応の観点から、新しいLTSが出ても、1年ぐらいは待った方が良いと思います。
英語版or日本語版はどちらを選んでも良いと思います。
日本語版を選んだ場合は、ユーザフォルダ以下の既定フォルダを英語化するのを忘れないようにしましょう。
LANG=C xdg-user-dirs-update --force # change from japanese to english
cat .config/user-dirs.dirs # confirm
ネットワーク接続確認
PCにLANケーブルを接続しても、ネットワークに接続しない場合があります。
ネットワーク周りの自動認識・自動設定は非常に賢く、nmcli
やnetplan
コマンドによる手動設定が必要なることは、経験的には少なかったです。
固定IP、プロキシ等の設定が必要であれば、ドライバインストール前に確認を行います。
(この時点で、エディタはnano等しか使えないことがあるので、nano
を使用します。)
固定IPの設定が必要な場合は、configファイルを適切に設定し、netplan apply
で設定反映すればOKです。
sudo vim /etc/netplan/99_config.yaml
sudo netplan apply
プロキシ環境がある場合であれば、プロキシも忘れないように設定します。
nano ~/.bashrc
PROXY=<proxy_server:port>
export http_proxy=$PROXY
export https_proxy=$PROXY
export HTTP_PROXY=$PROXY
export HTTPS_PROXY=$PROXY
sudo nano /etc/apt/apt.conf
Acquire::http::Proxy "<proxy_server:port>";
Acquire::https::Proxy "<proxy_server:port>";
ここまで行って、ネットワークが接続できない場合は、大半がネットワークドライバが入っていないことが原因でした。
ネットワークドライブが入っていない場合はインストールを行います。
この際、build-essential
が既に入っているか否かで、環境構築の難易度が大きく変わります。
入っているときと、入っていない時があるのですが、この差分は未だによくわかっていません。
(ご存知の方がいらっしゃれば、コメントをお願いいたします...)
build-essential
のインストール
ネットワークに接続できない、かつbuild-essential
がない場合の対応策です。
この場合、以下のいずれかの方法で解決してきました。
1. インストールメディアからインストールする
インストールメディアには、必要となるパッケージは入っています。
そこで、インストールメディアをマウントし、そこからapt install
を行います。
インストールメディアの場所を確認します。
sudo fdisk -l
Ubuntuのコード名を確認します。VERSION_CODENAME
やUBUNTU_CODENAM
に表示されるものです。
cat /etc/os-release
インストールメディアをマウントします。
sudo mkdir /media/install_media
sudo mount /dev/sdd1 /media/install_media
aptのソース元にインストールメディアを追加します。
sudo nano /etc/apt/sources.list
下記を追加します。
deb file:/media/usb-drive <ubuntuのコード名> main restricted
aptパッケージをupdateした後に、build-essential
をインストールします。
依存関係のエラーが出てきたら、不足しているパッケージ順に、順番にインストールすればOKです。
sudo apt update
sudo apt install build-essential
ドライブをアンマウントします。
sudo umount /media/install_media/
sudo rm -r /media/install_media
最後に、マウントしたドライブはソース元から外しておきます。
毎度、apt update
を打つたびに、ソース元にないと怒られ、邪魔になります。
sudo nano /etc/apt/sources.list
参考
2. build-essential
に必要なパッケージを出力し、別PCでダウンロードする。
build-essentialに必要なdebファイルの一覧を作成し、別PCでダウンロードする方法です。
はじめに、必要なパッケージのURLのリストを作成します。
ただし、この時点で、build-essential
のパッケージ名がaptのソースリストになく、実行できない場合もあります。
設定のSoftware & Updates
のDownloads fromを変更することで改善する場合もあります。
これが困難だった場合は、他の方法を検討するほうが良いです。
sudo apt --print-uris install build-essential | cut -d\' -f2 | grep http:// > debs.txt
その後、debs.txt
を他のPC(どのOS PCでも良い)に移し、リストのファイルをダウンロードします。
ダウンロード後、再度元のPC側にファイルを戻し、インストールを行います。
sudo dpkg -i *.deb
ただし、dpkgコマンドは依存関係を気にしないでパッケージインストールをしてしまうため、うまくaptを構築できない場合があります。
参考
3. WSLにて同様のUbuntu初期環境を構築し、apt cacheを移す。
ネットに接続済みのWindows環境にてWSL環境を新規構築し、archivesフォルダに入っているdebファイルを移す方法です。
新規にWSL環境を構築します
wsl --install <Distribution Name>
build-essential
をインストールし、archivesフォルダに残ったdebファイルをUSB等にコピーします。
sudo apt install build-essential
cd /var/cache/apt/archives/
ls | grep *.deb
ダウンロード後、再度元のPC側にファイルを戻し、インストールを行います。
sudo dpkg -i *.deb
純粋なLinux環境と、WSL環境の創意から、うまくaptを構築できない場合があります。
ネットワークインターフェイス
ネットワークドライブをmake
する環境が整ったら、インストールを行います。
IntelやRealtekの具体的なインストール方法は公式ドキュメントやREADMEを見るのがおすすめです。
具体的な内容で、make
等に詰まったとしても、偉大な先代の方々が多くのドキュメントを残してくださっているので、それらを参考にすることで解決することが大半です。
NVIDIAドライバ
公式ドキュメントを参考に、インストールを行ってください。
「Ubuntu NVIDIA ドライバ インストール」などで調べると、QiitaやZennなどの記事が出てくるかと思います。
一方、NVIDIAドライバのインストール手順は年々変化しているため、古い記事に従うと環境構築に失敗するリスクがあります。
記事投稿時にうまく成功した方法や、その時折の解釈が入っていることが多い印象なので、公式ドキュメントに従うのが良いです。
(そのため、この記事では具体的なインストール方法に関しては言及しません。)
QiitaやZennなどの記事は、公式ドキュメントに従ってインストールしてみたが、うまくいかないときに参照するのが良さそうです。
過去、詰まった経験としては、GPGキーがうまく通らなかったりすることやnouveau
の競合がありました。
GPGキーは、以下で更新できます。
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/comput
nouveau
は無効化しておくのが経験的には吉です。
sudo vim /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
諸々設定した後に、うまく動作しなければ再起動で大体設定反映されて、nvidia-smi
が通るようになります。
CUDA
使用できるCUDAのバージョンはNVIDIA architecutresというコード、GPUの型番に依存します。
こちらから確認することができます。
その後、自分のGPUにあったCUDAをインストールします。
動作させたいソフトウェア毎に、要求するCUDAのバージョンが指定されている場合もあるので、要注意です。
CUDAダウンロード後、PATHを通すのもお忘れなく
vim ~/.bashrc
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
複数のCUDAの環境を両立させたい場合は、PATHを使い分けたり、dockerを利用するのが良いです。
個人的には、システム環境にCUDAを乱立させると、訳がわからなくなるので、docker派です。
cuDNN
cuDNNはディープラーニング向けの高速化ライブラリです。
インストーラーは公式HPからをダウンロードすることができますが、NVIDIA Developer programへの登録が必要です。
無料で登録できるので、手続きを進めましょう。
最近では、ソフトウェア利用時にインストールを求められることも少なくなってきました。
(昔はCaffe等では使った方が良い印象でしたが、最近のpytorchでは求められません。)
python
システムPython環境には触らず、仮想環境を用いる方が良いです。
システムPythonにパッケージを追加したり、バージョンを上げたりしたことで、ろくな事がことが起こった試しがありません。
venv
やpyenv
、virtuelenv
、poetry
、rye
などたくさんありますが、個人的には好きなものを使えば良いと思います。
(プロジェクト開発であれば、内部でコンセントを取って、共通化しておくと良いかもです。)
conda
は正直おすすめできません。
学生時代は使い勝手の良さから沢山の人が使っていましたが、商用利用の制限から、スキルとして陳腐化しやすいからです。
docker
docker+GPUの環境を使用するのであれば、nvidia-docker
のインストールは行いましょう。
NVIDIAドライバにて、述べたように、公式ドキュメントに従ってインストールを行いましょう。
docker engine
→nvidia-docker
の順に、インストールが必要です。
プロキシ環境下であれば、プロキシ設定もお忘れなく。
動作確認時にimage pullする際に必要になります。
~/.docker/config.json
{
"proxies": {
"default": {
"httpProxy": "<proxy_server:port>",
"httpsProxy": "<proxy_server:port>"
}
}
}
その他
「NVIDIA Driver の再インストール = 環境を壊す覚悟」ぐらいに思っておいた方が良いです。
apt purge
等でパッケージと環境設定を削除して、再インストールを試みるも、2回に1回ぐらいはapt等の環境が壊れたり、起動後にブラックスクリーン化してしまう印象です。
さいごに
AI / Deep Learning開発向けの環境構築にて、経験上ハマるポイントをまとめました。
環境構築の勘所は、知識+経験によって、養われてきているのかなと振り返っています。
知識は、IPAの基本情報技術者試験や応用情報技術者試験の内容が役立つかなと考えています。
NW、PCハードウェアなどの勘所はつくのかなと思います。
Linuxを抑えるうえでは、新しいLinuxの教科書がおすすめです。
経験は、環境構築を作る試行錯誤や、ネットに掲載されている先人たちのQiitaやZennの記事で、養うことができるかなと考えています。
仮に環境を壊したとしても、重要なコードはGitHub等で管理されている前提で、気軽に環境再構築したら良いのかなと思います。
最後に、内容の誤っている点や、皆様の詰まりポイント・経験などがあれば、コメントいただけると幸いです。