1.GeForce RTX 3060搭載LinuxのPCでTensorFlowとCUDAを有効にするまとめ
・Tensorflow developer certificate受験用にPycharmでGPU付きTensorFlowをセットアップ
・Pop!_OSの流儀に従うと細かいVersion指定が出来ないので直でCUDAインストール
・CUDAインストールまで出来ればPycharmはWindowsと同様な操作感で動かせる
2.LinuxでCUDAを有効にしたTensorFlowをセットアップする方法
Windows10のPCとは別のPCを買ったわけではなく、WindowsがインストールされたSSDを外して新規に空のSSDを付けてLinuxをインストールしています。今回の目標もTensorflow developer certificate受験用のPycharmでGPUをONにしたTensorFlow環境を構築する事です。(なお、受験はGPUがないパソコンでも問題ないように考慮されているというお話なので本稿に書かれている作業が必須なわけではありません。)
インストールするディストリビューションは最近人気が上昇しているPop!_OSを使いました。
基本はInstall Pop!_OS On Your Computer(https://support.system76.com/articles/install-pop/)に書かれている指示に従って、インストールしていきます。
事前に用意するもの
・WindowsのPC
起動用USBドライブを作成するために使用します。
・Linuxインストール用のハードディスク/SSD
1つのディスクに2つ以上のOSを入れるデュアルブートも出来なくはないですが、今回は空のSSDが接続されている前提です。
・USBドライブ
最近のOSはサイズが大きすぎてCDやDVDには入りきらないのでUSBドライブを使います。最近は大きなコンビニでも売ってますね。当初、かなり前に買ってずっと使っていなかったUSBを使ったのですが、壊れてしまっていたようで途中でトラブリました。事前にWindowsで容量や書き込みに問題がないかチェックしておくと良いと思います。
1.Pop!_OSのisoイメージをダウンロード
USBに書き込むisoイメージをhttps://pop.system76.com/よりダウンロードします。私はPOP!_OS 20.10のNVIDIA同梱版「DOWNLOAD 20.10(NVIDIA)」を選びましたが、後述しますが、同梱版でなくてもよかったかもしれません。
pop-os_20.10_amd64_nvidia_11.iso(2.58GB)
2020年3月6日追記)20.04 LTS対応のCUDA tool kitが公式から出ているので、CUDAを使いこなすのであれば20.04 LTSの方が望ましいかもしれません。私は20.04LTSで入れなおしました。
2.USBディスクに起動用ISOイメージを書き込むツールbalenaEtcherをダウンロードして起動用USBを作成
WindowsPCを立ち上げUSBにisoイメージを書き込むツールをhttps://www.balena.io/etcher/からダウンロードします。
balenaEtcher-Setup-1.5.116.exe(124MB)
インストールは特にディフォルトのままでインストール。クリックすると下記画面が立ち上がるので書き込むISOイメージ、書き込む先、を選択し、「Flash」を押します。
書き込み中の画面が出て2~3分で終了し、起動用USBが出来上がります。
3.インストール先PCの電源を入れてBIOS設定画面を立ち上げる
BIOS設定画面とはマザーボードの設定を行う画面です。
通常、電源を入れてOSが立ち上がる前に特定のキーを連打する事で起動できますが、BIOS画面を出す方法は機種によって違うので、ご自分のパソコンの販売元/メーカーに聞くのが一番確実です。問い合わせ先が不明な場合は「<お使いのパソコンの型番> BIOS」で、検索するのも有効です。
一応、元ドキュメントには
デスクトップPCの場合はF12かF8かF10を連打
ノートPCの場合はF7かF1かF2を連打
と書いてありましたが、私のPCの場合はDELキーを連打でした。
BIOSのメニューが立ち上がると、行う事は2つです。お使いの機種によって画面やメニュー構成は違うので画面はあくまで操作イメージとお考え下さい。
(1)Secure BootをOFFにする。
Secure BootはWindows用の仕組みなのでこれをONのままにしておくとインストールに失敗します。
綺麗に写せてませんが、Secure Bootをdisableに設定しています。
(2)USBディスクから起動するようにする
マザーボードは接続されている様々なディスクを順番にチェックして起動用の情報が書き込まれていたらそのディスクを使って起動します。USBディスクの起動順は通常下位の方にあるのでこれを一番上に持ってきます。
boot順番が最初がHard DriveになっているのでここをUSB Hard Driveに変更しています。
繰り返しになりますがBIOSで設定できる内容や画面はお使いの機種によって異なり、ある程度メニュー内容は共通ではあるのですが、上記と同じ画面ではないはずです。同様な設定項目がどこかにあるはずなので上記画面を参考にしつつ探してみてください。
設定が変更出来たら、Save & Exitをした後、電源ボタンを押して一度終了します。なお、下から4番目のRestore Defaultを押すと、何を変更したのかわからなくなってしまっても工場出荷時の初期設定に戻せます。
4.USBドライブから起動
準備ができたインストール先のPCにUSBを刺して起動してインストールします。インストール先は空のSSDの前提です。Secure Bootをオフに出来ていないと下記のような「error: /casper_pop-os_20.10_amd64_nvidia_debug_14/vmlinuz.efi has invalid signature. error: you need to load the kernel first」とエラーが出て失敗します。要はOSのsignatureが確認できないとエラーを出しているのですが、Secure BootはWindowsのsignatureしか知らないので世の中には君の知らないOSもあるんじゃよ、という事でSecure BootはOFFにするしかないのです。
問題がないと下記のようなインストール準備画面が出て来ると思います。
ここまでに書かれていない問題が発生した場合はhttps://pop-planet.info/forums/threads/pop-_os-not-installing-check-this-first.254/に書かれている下記チェックリストをチェックすると良いと思います。
• Installation media created with the wrong software (we recommend Etcher or Popsicle).
• Downloaded ISO corrupted.
• Secure Boot not disabled.
• Fast boot not disabled.
• Legacy boot not disabled for UEFI.
• UEFI boot not disabled for Legacy/GRUB systems.
• Sometimes it starts after a second reboot.
• Install media not removed when rebooting after install.
• Incorrect installation media (NVIDIA vs. Intel).
• EFI partition not large enough or configured correctly for dual boot.
• Corrupt, unreadable, or imcompatible hard drive or partition table.
ここは本当にお使いのパソコンによってどのようなトラブルが発生するかはわからないので、エンジニア魂が求められる場面です。生憎そんな魂は持ち合わせてないようだと感じたら改めて「人工知能/機械学習を学ぶ際の開発環境の注意点」に戻って、ColabやJupyter Notebookの利用を再検討しましょう。
大きな組織に所属すると、こういったインフラ関連の作業を受け持つ専門の部署が存在 or 外部業者に一括で任せる事が出来るのでPCでGPU環境を設定する事は汎用性があるスキル/キャリアとも言い難いです。このレベルの作業はエンジニア魂に満ち溢れた人 or GPUに飢えた小規模組織/個人が行う非常に難度の高い作業であり、深入りしない事を選択するのも賢明であるかもしれません。
また、Linuxと聞くとスペックの劣る古いPCの再生用に使われる事も多いと思いますが、Ubuntu 20.04などの最近のLinuxは推奨メモリが4GBなので(Pop!_OSは2GB)そこそこのスペックが前提になっています。
私が今回使ったパソコンはB460チップセット搭載マザーボード、つまり、1年くらい前に発表された第10世代インテル Core プロセッサー対応マザーボードを使っています。(どちらかと言うと下位モデルでWifiが搭載されてないので注意です)あまり新しすぎるマザーボードでも、古すぎるマザーボードでも十分にテストされない可能性が高いので、発売からそこそこ経過して安定してそうなマザーボード/パソコンを選ぶとトラブルを未然に避ける事が出来るかと思います。
5.インストールの設定
インストールが始まると色々と聞かれると思います。キーボード等の設定が聞かれますが、この段階では日本は選ばずにEnglish、もしくはdefaultを選ぶなど、変更しないでおきましょう、おそらくトラブルを未然に避けれそうです。(キーボードは後で再び選ぶタイミングがあります。POP!_OSは稀にしか選ばれないような選択肢はあまりテストされてない感触を受けています)
ディスク暗号化の選択です。Don’t Encryptをするとディスク暗号化なし、Choose Passwordを押すと入力したパスワードを元にディスクの暗号化が行われ、起動時に毎回入力を求められるようになります。ノートパソコン等で持ち歩く方は暗号化した方が良いかもしれませんが、これはお好みで大丈夫です。
5.インストールの開始
一通り設定が終わるとインストールが開始されます。私はこのタイミングで下記hardware errorが出ました。
ログを見るとEXTRACT ERROR(解凍エラー)が出ており、元々のUSBディスクが破損していたのか、交換をしたらこのエラーは出なくなりました。(ただ、起動用ISOイメージを書き込み時にはエラーになっていないので少し解せません。インストール設定時にキーボード設定などを日本に変更してしまった事が影響している可能性もあります。同様なエラーで質問している人が言語設定はディフォルトのままの方が良いとアドバイスを受けていました。)
問題なくインストールできるとアカウントの作成やタイムゾーン、そして再びキーボードを聞かれるのでここでJapanese(Mozc)を選んでおけば日本語入力は出来ます。また、インストール完了後に他のタイプのキーボードを追加できます。
インストールが完了し、ログインした後に右上の▼部分からMOZCを選べば日本語が入力できます。
6.CUDAのインストール
Pop!_OSの流儀的にはhttps://support.system76.com/articles/cuda/にあるように
sudo apt install system76-cuda-latest
などのコマンド一発でインストール、もしくはTensorman(https://support.system76.com/articles/use-tensorman/)を使って様々なVersionのTensorFlowをDockerで簡単管理!と言う事だと思うのですが、こちらの欲しいVersionをドキュメントに書いてある通りaptで指定してインストールしようとしても見つからないとエラーになるのと、Dockerのオーバーヘッドを回避したいと考えていたので、今回は直でインストールしました。
実はけっこうすんなり動いてくれました。https://www.tensorflow.org/install/gpuの
Ubuntu 18.04(CUDA 11.0)
のセクションに書いてある以下のシェルでインストール出来てしまいます。今回、私がインストールしたのは、Ubuntu20.10ベースのPop!_OSですが特にエラーにはならず問題は発生しなかったです。
# Add NVIDIA package repositories wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600 sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /" sudo apt-get update wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb sudo apt-get update # Install NVIDIA driver sudo apt-get install --no-install-recommends nvidia-driver-450 # Reboot. Check that GPUs are visible using the command: nvidia-smi wget https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/libnvinfer7_7.1.3-1+cuda11.0_amd64.deb sudo apt install ./libnvinfer7_7.1.3-1+cuda11.0_amd64.deb sudo apt-get update # Install development and runtime libraries (~4GB) sudo apt-get install --no-install-recommends \ cuda-11-0 \ libcudnn8=8.0.4.30-1+cuda11.0 \ libcudnn8-dev=8.0.4.30-1+cuda11.0 # Install TensorRT. Requires that libcudnn8 is installed above. sudo apt-get install -y --no-install-recommends libnvinfer7=7.1.3-1+cuda11.0 \ libnvinfer-dev=7.1.3-1+cuda11.0 \ libnvinfer-plugin7=7.1.3-1+cuda11.0
Pop!_OSにログイン後、左上のActivitis→左に出て来るランチャーからTERMINALを選んでターミナル画面を起動。
vi install.sh
iキーを押して挿入モードにして、前述のシェル内容をコピペ
ESCキーを押して「:wq!」と打った後にENTERキーで保存してviを抜ける。
下記コマンドで実行権限を与える
chmod +x install.sh
下記コマンドでインストール実行です。実行中に何度か質問を受けますが、全てyでOKです。
./install.sh
これでドライバも問題なくインストール出来てしまったので、そもそもドライバ同梱のisoイメージが必要なのかと言う疑問が出てきましたが、NVIDIA謹製のソフトウェアも同梱されているようなので、もうちょっと使ってから結論を出そうと思います。
2020年3月6日追記)CUDA tool kitを使ってコンパイルが必要なライブラリでは、この手順では動かす事ができず、20.04 LTSでクリーンインストール、ドライバをapt remove、NVIDIA公式からダウンロードしたCUDA tool kitを入れなおす、事で動かす事が出来たので、そもそもドライバいるのか説は高まりました。ただ、USBは刺してすぐ認識しますし、Brotherのプリンタをネットワーク接続させてWindowsから使っているのですが、何も設定せずとも自動的にBrotherのプリンタを発見していたので、使い勝手はいいなぁ、と感じています。(Ubuntuの機能かもしれませんが)
2022年8月追記
NVIDIAドライバ同梱版でないイメージを使ってインストールした際に少し手間取ったので、NVIDIAドライバ同梱版を使った方が良さそうと今は思っています。
7.Pycharmのインストール
インストールされているFireFoxでhttps://www.jetbrains.com/ja-jp/pycharm/download/からPycharmをダウンロードして保存します。私のように普段FireFoxに使い慣れていないとダウンロード先がわからなくなってしまう事があるかもしれませんが、右上の本棚マークよりダウンロードファイルが確認できます。
ディフォルトでしたら/homeディレクトリのDownloads配下にダウンロードされていると思うので、
tgzファイルを下記コマンドで解凍
tar xvfz pycharm-community-2020.3.3.tgz
ディレクトリを移動して、下記コマンドでPycharmを起動できます。
cd pycharm-community-2020.3.3/bin
./pycharm.sh &
起動後はWindows版と全く同じ手順でセットアップするとGPUが認識されている事が確認できると思います。
8.戦いは続く
Tensorflowのチュートリアルなど、シンプルなスクリプトですと上記手順で入れたPycharm上から動かす事が出来るのですが、深いレベルや大規模モデルになってくると、Runtime Errorなど原因不明のエラーに遭遇し、ネットで検索しても「誰もまだ解決できていないようだ」と言う未解決である事がわかるだけ、なんて事もあると思います。
私も現在、原因不明のCUDNN_STATUS_MAPPING_ERRORに悩まされていますが、多分、明示されていないライブラリの依存関係があるように感じるので、自分でソースからコンパイルしなおすなど、エンジニア魂を振り絞って奮闘中です。
この辺りの作業が辛く感じた方は「人工知能/機械学習を学ぶ際の開発環境の注意点」を読んで違うタイプの開発環境を選択するのも一手と思います。
8.捕捉)インストール用にしたUSBの復活方法
Linuxインストール用にOSを焼き込んだUSBはWindowsに刺しても、4MBくらいの容量を持つディスクとして認識されたり、USBを指すとそのものが「USBドライブ(D:)にディスクを挿入してください」などとエラーが出て認識されなくなり、フォーマットも出来ず、再利用出来なくなってしまう事があります。
Windowsなどで使えるように復活させるためには、Windowsのコマンドプロンプトより「diskpart」と入力します。
diskpartが別ウインドウで立ち上がります。
開いたWindowで「list disk」と入力します。
ディスクサイズなどからUSBディスクを特定し、その番号のディスクを「select disk <番号>」として選択します。問題なく選択できたら行の先頭に※印が付きます。
cleanと打ち込みます。正常にクリーンな状態になりました、と出たら、もうディスクとして認識できるようになっているのでフォーマットも出来ます。exitと入力して終了します。
Windows10であれば左下の検索窓に「ディスクの管理」と入力し、出てくる「ハードディスク パーティションの作成とフォーマット」を選択します。
表示された「ディスクの管理」ツールで該当のディスクを右クリックし、「新しいシンプルボリューム」を選択し、そのまま全てディフォルトで実行する事で従来通りUSBが使えるようになります。