yag's blog

Twitter以上Zenn以下なことを書く場所

スイッチングハブを買い替えた

新しく組んだPCのspeedtestが100Mbpsくらいで頭打ちになっていたのでもしやと思ったら、使っているスイッチングハブ100BASE-Tだった。普段はNASNEなどで利用しているハブだったので速度低下に気付かなかった。1000BASE-Tのものに買い替えて無事速度が出て満足。

ところでスイッチングハブの説明文に「10/100/1000Mbps」とあり、これは回線速度ととしては1000Mbpsが全部包含するのに何故わざわざ書くのかと思ったが、規格の表現として10Mbpsでも100Mbpsでも1000Mbpsでも対応しているという意味らしい。おそらくコンテクストがあると思うので無粋かもしれないが、本来の通信速度の意味と混同してしまうので、だったら10/100/1000BASE-T のように書いてほしい気がする。

GPU/CUDAとPyTorch周りの様々なバージョンを理解する

前置き

GPUを利用したディープラーニングの環境構築において、GPUのドライバやCUDAの諸々の設定は初学者が誰しも嵌る最初の難関と言える。私自身これまではネットの情報をあれこれ試して上手く行けばOKで済ませていたが、この辺で今一度正しく理解しておきたい。そこでこの記事を通して、GPU/CUDAとPyTorchの環境構築で遭遇する様々なバージョンの識別とその意味を理解することを目的とする。なお、細かなインストール方法やエラー対応などは本記事では扱わない。また、グラフィックボード/グラフィックカードと呼ぶべきところをGPUと表現している点もご容赦いただきたい。

[注意] この記事はGPU/CUDA素人が書いているので、細かな用語や名称の間違いが多分に含まれていると思われる。間違っていたらごめんなさい。また、事例として紹介しているバージョン番号は当然ながら時が経つにつれ古くなるので注意。

GPU/CUDA

Compute Capability

7.58.6sm_*と表記されるもの。これは使用するGPUアーキテクチャに応じてサポートされる機能が決まっており、それを表すバージョン番号がCompute Capabilityである。ハードウェアのGPUにはそれぞれこの番号が付いていて、変わることはない。例えば、RTX 3090とRTX 4090では以下のようになっている。

GPU Architecture Name Compute Capability SM Variation
GeForce RTX 3090 Ampere 8.6 sm_86
GeForce RTX 4090 Ada Lovelace 8.9 sm_89

現行GPUのCompute Capability対応表は、以下から確認できる。

developer.nvidia.com

CUDA

10.211.8などと表記されるもの。これはCUDAのバージョンを表す。バージョンごとにサポートするGPUの種類、すなわちCompute Capability (CC) の範囲が決まっている。

CUDA Version min. CC max. CC
CUDA 10.2 3.0 7.5
CUDA 11.8 3.5 11.8

現在インストールしているCUDAのバージョンは、nvccコマンドや/usr/local/cuda/version.{json, txt}などから確認できる。

$ /usr/local/cuda/bin/nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0
$ cat /usr/local/cuda/version.json

なお、CUDAの中には大きく分けてCUDA ToolkitとNVIDIA Driverが存在し、そのNVIDIA Driverの中にGPU Kernel Mode DriverとCUDA User-Mode Driverの2つが存在する。後者が次に説明するNVIDIA Driverのこと。

https://docs.nvidia.com/deploy/cuda-compatibility/graphics/CUDA-components.png

CUDA Compatibility :: NVIDIA Data Center GPU Driver Documentation より

NVIDIA Driver

470.57.02515.43.04、もしくはR470R515などと表記されるもの。これはNVIDIA Driverのバージョンを表す。先頭の数字を取ってリリース単位を意味するR515, R510, R470と表記されることもある。

Ubuntuの場合、以下のようにしてGPUに応じたDriverのバージョン一覧および推奨バージョンを取得できる。

$ sudo ubuntu-drivers devices
[...]
vendor   : NVIDIA Corporation
model    : GA102 [GeForce RTX 3090]
driver   : nvidia-driver-470 - third-party non-free
driver   : nvidia-driver-515-server - distro non-free
driver   : nvidia-driver-515-open - distro non-free
driver   : nvidia-driver-520-open - distro non-free recommended
driver   : nvidia-driver-520 - third-party non-free
driver   : nvidia-driver-515 - third-party non-free
driver   : nvidia-driver-510-server - distro non-free
driver   : nvidia-driver-510 - third-party non-free
driver   : nvidia-driver-470-server - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

PyTorch

1.101.12+cu116などと表記されるもの。これはPyTorchのバージョンを表し、対応するCUDAのバージョンを末尾に付与する場合がある。

PyTorchをGPUで動かすにはCUDAやドライバのバージョンをあわせる必要があり、PyTorch公式ページのInstallationの「Compute Platform」の箇所で必要なCUDAのバージョンから選択できる。単純にpip install torchのみを実行すると、2022/10現在ではCUDA 10.2対応のものがインストールされる。そのため、そもそも利用するGPU自体のCompute CapabilityがCUDA 10.2では対応できない場合には、CUDAをダウングレードしただけでは動かないということが起こり得るので注意が必要となる。

使用するGPUのCompute Capabilityを確認し、次に正しいバージョンのCUDA Toolkitを入れ、そしてそれに対応するPyTorchを入れよう。

https://pytorch.org/get-started/locally/

インストールしたPyTorchが対応する各種バージョンを確認する方法は、以下の通り。

CUDA 11.6対応版の場合

In [1]: import torch

In [2]: torch.__version__
Out[2]: '1.12.1+cu116'

In [3]: torch.version.cuda
Out[3]: '11.6'

In [4]: torch.cuda.get_arch_list()
Out[4]: ['sm_37', 'sm_50', 'sm_60', 'sm_70', 'sm_75', 'sm_80', 'sm_86']

In [5]: torch.cuda.get_device_capability()
Out[5]: (8, 6)

CUDA 10.2対応版の場合

In [1]: import torch

In [2]: torch.__version__
Out[2]: '1.12.1+cu102'

In [3]: torch.version.cuda
Out[3]: '10.2'

In [4]: torch.cuda.get_arch_list()
Out[4]: ['sm_37', 'sm_50', 'sm_60', 'sm_70']

In [5]: torch.cuda.get_device_capability()
/home/yag_ays/xxx/.venv/lib/python3.9/site-packages/torch/cuda/__init__.py:146: UserWarning:
NVIDIA GeForce RTX 3090 with CUDA capability sm_86 is not compatible with the current PyTorch installation.
The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70.
If you want to use the NVIDIA GeForce RTX 3090 GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/

  warnings.warn(incompatible_device_warn.format(device_name, capability, " ".join(arch_list), device_name))
Out[5]: (8, 6)

ここではtorch.cuda.get_device_capability()を実行するとWarningが表示されているが、これは実行環境においてGPUのCompute CapabilityとインストールされているPyTorchのバージョンが合わないというもの。もちろんこのままGPUを使ったディープラーニングのコードを実行してもエラーになるだけなので、PyTorchを再インストールする必要がある。

参考

ディープラーニング開発用のそこそこハイエンドな自作PCを作った

最近個人プロジェクトでディープラーニングを使った開発をしており、今まではGPUを利用する際はColabやGCPGPUインスタンスを利用していたが、以下のような理由により少々窮屈になってきた。

  • Colab Pro/Pro
    • これまでのセッションが維持される限りの使い放題から、マシンスペック等に応じたユニット数の積算で月単位の利用可能が変わるクレジット制になった
    • デフォルトのPythonのバージョンが3.7と明らかに古く、手元での開発を古い方に寄せるのが面倒で、かつColab側をセッションごとにバージョンアップするのが大変
    • Google Driveをマウントした開発が可能ではあるものの、頻繁に更新するコードの管理に向いておらず、Colabから呼び出すときに意図したデータを読みこんでいるか常に不安になる
  • GCP
    • マシンスペックが自由自在でsshもできて起動/終了が容易かつ時間単位のコスト支払いのみで利用できる点は素晴らしい
    • 使った分だけ支払うというのは便利な一方、いろんな物事に追われる感覚がある。時間単位の生産性を最大化したいと考え、逆に進捗のないバグ取りや無駄な学習などに対する心理的損失が大きい
    • クラウドというのは、あくまでスケールアウト用途に使うのが一番便利かつお得という結論 (個人的な感想)

そこで、気兼ねなく使えるディープラーニング開発用の自作PCを自作することにした。正直なところ自分が満足するスペックのPCを作る際の金銭的な支出はかなり大きく、クラウドなら何十,何百時間分に相当するだろうかと考えて頭を悩ませたものの、モノとして残るという心理的な安心感(?)や、プロジェクトの進捗の無さを紛らわすために何か手を動かしたいという現実逃避から、そういった決断をするに至った。

スペック選定

どんなPCを作ろうかと考えたときに、ディープラーニングの学習に耐えうるスペックというのはあらかた目星がついていたので、それまで利用していたGCPインスタンスのスペックを比較対象としつつ、以下のようなことを考えた。

  • CPU
    • ある程度普通のもので良い。コア数が多いと嬉しいかなくらい
  • GPU
    • GPUディープラーニングの学習の要なので、値段が高くても後々後悔しないように良いものを買いたい
    • 少なくとも全体的にT4同程度かそれ以上の性能がほしい
    • 物理的なサイズが大きすぎるとPCケースに入り切らないことがあるので、ある程度小さいものが良い
  • メモリ
    • 32GBだと結構厳しいときがあるので、64GBは欲しい
  • その他
    • 光らないでいい、なるべく静かでいてほしい
    • OSはとりあえずUbuntuを入れて、ゲームがしたくなったらWindowsは後々準備すれば良い

BTOや既製品も考えたが、妥協できない点とできる点が通常のゲーマーとはかけ離れていてカスタマイズに不安があること、なるべくはやく手に入れてたいということで、自作を選択。

一番検討が必要なGPUは、GPUメモリを基準に考えるとGeForce RTX 30シリーズの中では3090および3090Ti以外は選択肢に乗せられず、自ずと選択肢が絞られてしまった。4090のスペックの高さには心を惹かれてしまったが、入手性や金額を差し置いてあの物理的な大きさに圧倒されて候補から除外。他にはNVIDIA RTX Aシリーズも検討したが、入手の容易さや値段、リセールバリュー等を踏まえてこちらも候補から除外。

自作をする上で参考にした情報

私は自作PCは完全に初心者で、しかもmacOS以外の物理PCなんて15年ぶりくらいということで、構想時点では必要な知識が足りていなかった。おおよその部品の機能やスペックの情報は理解できるが、物理的な配線や製品の規格は苦手だった。事前準備としてメーカーやパーツ選び、組み上げ方などの学習は、基本的にYouTubeを活用した。一昔前なら書店で雑誌を買ってきて読み込むということをしていただろうと考えると、動画で情報が溢れていて便利な世の中だと思う。

各パーツの価格は基本的にAmazonやオンラインPCショップの情報を纏めて最安値を狙おうとはしたものの、経験の少ない自作初心者が複雑なことをして落とし穴にハマることを避けたく、また短期間で組み上げたいという理由から、秋葉原の物理店舗の数件を比較して安めのところでまとめて購入することにした。

購入したもの

主要なパーツ名と金額は以下の通り。キーボードとマウスは家にあったものを流用した。

name type Price
Fractal Design Define 7 Compact Black ケース ¥11,591
MSI B550 GAMING PLUS マザーボード ¥21,780
AMD Ryzen 9 5900X CPU ¥64,800
Palit NVIDIA GeForce RTX3090 GPU ¥173,800
Crucial DDR4 3200MHz 32GB x 2 メモリ ¥27,030
Western Digital SN770 1TB SSD ¥11,080
Antec NeoECO 850W PLATINUM 電源 ¥18,000
NZXT KRAKEN X63 CPUクーラー ¥19,800

その他グリスや細かいものを含めて、全体で35万円程度となった。まあまあな値段だと思いつつ、1世代前のハイエンドな構成が比較的安価で組めたので上出来ではないかと思う。

ちなみに、ケース以外のパーツは秋葉原に行って1回で全部購入したが、両手にはちきれんばかりの手提げを持って帰るのが本当に大変だったので、一部オンラインで買うか車を利用したほうが良かったかもしれない。

組み上げ

組み上げた結果はこんな感じ。仮組みもせず一発本番だったが特に失敗もなく、5,6時間程度で組み上げることができた。マザーボードにファンやケース部品の配線をするところで手こずったのは事前に予想していた通り。マザーボードをケースに付けた状態でケーブル取り回しのためにコネクタを何度か抜き差ししたが、作業しづらい狭さと暗さの状態での作業はピン折れしそうで危なかったなと後々思った。

おわりに

今回は、ディープラーニングの開発をするための自作PCを素人の自分が構築した流れを紹介した。実際にGPUで学習を回すまでのソフトウェアの準備もなかなか大変ではあったが、それはまた別の投稿で紹介したい。だいぶ楽になったとはいえ、人類はいつになったらCUDAのインストールに頭を悩ませなければいけないのか……。

いよいよこれで逃げられなくなってきたので、サンクコスト化しないように頑張ってディープラーニングを向き合いたいところ。

Blogを再開します

久しぶりにブログを再開します。ワイワイ!

というのも、最近TwitterやZennなどでのアウトプットに対する「ちゃんとしなきゃ」感が強い。もっと作業ログとか雑な思考の吐き出し場があると良いなと思い、改めてこのブログを引っ張り出してきた。使ったことがないプラットフォームにでも新しく作ろうかと思ったけれども、これまでの経験から途中で疲れてくることは目に見えているので、ブログを書く心理的負荷を下げるためにも凝ったものは使わないことにした。やっぱりブラウザにエディタがあって、開いたらすぐ書き出せるというのは、何かと大きい気がする。

買ってよかったもの、そうでもないもの 2021

今年買ってよかったもの、またはそうでもないものを書き出してみます。

買ってよかったもの

AfterShokz Aeropex

今流行の骨伝導イヤホン。最初は敬遠していたがいざ試してみるとかなり使い心地が良い。左右をつなぐケーブル部分が固くて、首元にかかったりしないので良い。主に犬の散歩時にPodcastやラジオを聞いたりしている。

不満点があるとすると、メガネを掛けてマスクを付けている状態でこれをつけるとメガネがずれたりマスクが引っかかったりと、耳回りが渋滞してあまり心地よくはない。

FlexiSpot 電動式昇降デスク

とうとう昇降デスクを導入してしまった。天板も足もFlexiSpotで購入。めちゃくちゃ重いので組み立てや設置が大変だったが、一旦置いてしまえばあとは動かしたりしないので問題なし。最初の家は上げたり下げたりしていたが、最近はもっぱら上げっぱなし。デスク前で立って仕事をするか、ソファで座って仕事をするかのどちらかになっている。

デスクライト BenQ ScreenBar

ディスプレイの上に置く型のデスクライト。角度が調整されていてディスプレイに光が当たらないので、デスクライトを付けた状態でも何の問題もなくディスプレイで作業できるのがとてもよい。自動調光もできてUSBで給電できてしかも場所も取らないので非常に便利。

防災グッズ

家族や犬がいることもあって、最低限の災害対策はしておいたほうが良いと思って一通り揃えた。飲料や食事系は野外に置けるコンテナを買ってその中に収納している。電池やラジオ等のグッズは玄関の靴入れの一角に置いてある。

ライトは以下のものを買ったが、光の照らし方も調節できて電池1個で動くので良さそう。まだ実践で使ったことはなく、これからも無いことを祈る。

エレコム クリーニングクロス

これまで無印の使い捨て型のメガネ拭きを使っていたが、クロスに乗り換えた。拭き心地も良くて良い。

YouTube Premium

広告の無い世界は最高。これのせいでYouTubeを見すぎている感は否めない。

YouTube Premium - YouTube

そうでもなかったもの

マグネットケーブル ケーブルクリップ

昇降デスクの配線整理のために購入したもの。ケーブルに付ける磁石の部分があんまり良くなくて、USB-Cの太いケーブルが入らなかったり、逆に普通のケーブルはスカスカでスライドしてずれてしまって、あんまりケーブル管理に役立たなかった。Ankerのケーブルホルダーの方が良いかもしれない(未確認)。

BeatsX ワイヤレスイヤホン

Amazonでセールになっていたので購入したものの、AirPodsのような左右分離に慣れているとケーブルが左右のイヤホンに繋がっているのが邪魔でしょうがなくなってしまい、結局手放してしまった。

MYNUS iPhone 12 ケース

MYNUSのiPhoneケースのサンドグレー。ケース下部のLightningコネクタ部分のディスプレイ側に切れ目が入っていて、ここに衣服などが引っかかることがあり、最終的にはここの部分が曲がってケースが壊れてしまった。手触りや色はものすごく気に入っていたこともあり、とても残念だった。