【Python】機械学習で使う「apex」がインストールできないときの対処方法(Windows)

プログラミング,python

機械学習まわりのプログラムを動かそうとしたときに、NVIDIA/apexというライブラリを使うことが多いようです。

NVIDIA/apexとは、FP16の演算を前提とした(順および逆)伝播計算等を支援する関数群で、これがあると処理速度が通常の2倍から4倍程度早くなるものです。

使い方としてはgitをcloneしてきて、pip installするだけ・・・と思ったのですが、案の定エラーが出てうまくインストールできなかったので、対処方法を備忘録として残しておこうと思います。

一応Windows11で発生したエラーですが、macやunixでも同様のことがあるかもしれません。

実行環境

  • Python 3.7.15
  • Windows 11
  • torch(Version: 1.13.1+cu117)
  • GPU(NVIDIA Ge Force RTX 2070 SUPER)

apexのインストール方法

apexはpipで直接インストールはできないようです。

gitからapexをcloneして、ローカルでpip installをします。

git clone https://github.com/NVIDIA/apex
cd apex

cdしたら、pip installを実行します。

ちなみにpip installのやりかたはいくつか用意されているらしく、以下のいずれかを実行します。

(Linuxの場合)pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
(Windowsの場合)pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" .
(上記が動かなかった場合)pip install -v --no-cache-dir .

cloneまではよかったのですが、pip installの部分でエラーが発生しました。

エラーの内容は以下の通りです。

Exception information:
Traceback (most recent call last):
  File "C:\Users\○○\anaconda3\lib\site-packages\pip\_internal\cli\base_command.py", line 186, in _main
    status = self.run(options, args)
  File "C:\Users\○○\anaconda3\lib\site-packages\pip\_internal\commands\install.py", line 331, in run
    resolver.resolve(requirement_set)
  File "C:\Users\○○\anaconda3\lib\site-packages\pip\_internal\legacy_resolve.py", line 177, in resolve
    discovered_reqs.extend(self._resolve_one(requirement_set, req))
  File "C:\Users\○○\anaconda3\lib\site-packages\pip\_internal\legacy_resolve.py", line 333, in _resolve_one
    abstract_dist = self._get_abstract_dist_for(req_to_install)
...
    command_desc='python setup.py egg_info',
  File "C:\Users\○○\anaconda3\lib\site-packages\pip\_internal\utils\subprocess.py", line 242, in call_subprocess
    raise InstallationError(exc_msg)
pip._internal.exceptions.InstallationError: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
C:\Users\○○\anaconda3\lib\site-packages\pip\_internal\commands\install.py:244: UserWarning: Disabling all use of wheels due to the use of --build-option / --global-option / --install-option.
  cmdoptions.check_install_build_global(options)
    Running command python setup.py egg_info


    torch.__version__  = 1.6.0+cu101


    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\○○\AppData\Local\Temp\pip-req-build-daoc5yp7\setup.py", line 137, in <module>
        _, bare_metal_version = get_cuda_bare_metal_version(CUDA_HOME)
      File "C:\Users\○○\AppData\Local\Temp\pip-req-build-daoc5yp7\setup.py", line 17, in get_cuda_bare_metal_version
        raw_output = subprocess.check_output([cuda_dir + "/bin/nvcc", "-V"], universal_newlines=True)
    TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

エラーの内容・詳細

まず最初に疑ったのは「python setup.py egg_info」と出ているので、Pythonのバージョンの違いやpipのバージョンです。

結論からいくと、今回の問題はそこではありませんでした。

Tracebackのエラーを見ると「TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'」とあり、setup.pyの17行目でエラーが出ているようです。

試しに該当箇所のcuda_dirという変数をprintしてみると中身がNoneになっていました。

Noneのものとファイルパスの文字列を結合しているので、型が違うからエラーということですね。

なるほど、と思ったのですが、じゃあどうすればいいのか?

setup.pyでエラーなら既知のバグだろうと思って調べていたのですが、それらしい情報はまったく出てきません。

途方に暮れているなか、それらしいことをやり取りしているissueを発見。

TypeError: unsupported operand type(s) for +: 'NoneType' and 'str' #990

その中に、「GPUがないマシンだと、タイプエラーが出るよ」と言っている人がいました。

GPUがないマシン?いやあるけども、と思いつつ、exportを実行。

Windowsはexportがないので、setで代用します。

set TORCH_CUDA_ARCH_LIST="compute capability"

再度実行しても、同じエラーが出たので解決には至りませんでした。

この時点で違和感に気づくべきだったと、今では思います。(GPUがあるのに、GPUが無いマシンと同じエラーがでている・・・)

unsupported operand type(s) for +: 'NoneType' and 'str' の解決方法

同じissueにコメントしている人の中にさらにこんなコメントがありました。

ここで初めてnvccというものの存在を知りました。

同時にcudaというものの存在も知りました。詳細は完全に理解しきっていないですが、cudaがないとGPUをNVIDIAは認識できない?

そういえばエラーの部分を見直してみるとcuda_dir という変数が空なのでエラーになっていそうでした。

setup.pyのエラー箇所:raw_output = subprocess.check_output([cuda_dir + "/bin/nvcc", "-V"], universal_newlines=True)

cudaが入っていないからディレクトリの位置もわからずエラーになっているのでは・・・?と思い、NVIDIAのCUDAをインストールしてみます。

この記事を書いている時点での最新バージョンは12.0です。

CUDA Toolkit 12.0 Downloads

インストールのためのファイルの設定は以下の通りです。

ダウンロードしたexeファイルの指示通りに進めていきます。

インストールが完了するまで、10分ほどかかりました。

半信半疑のまま、pip installを実行してみると・・・通った!

というわけで、NVIDIA/apexをインストールするにはNVIDIA CUDAが必要です。

私がドキュメントをしっかり読まなかったからかもしれませんが、AI学習するうえで、こういう環境構築周りのドキュメントが本当に不足していると思います。

やりたいことを始める前に心が折れそう、という人も少なくないのではないでしょうか。

以上です。

お役に立てれば幸いです。

追記:No module named 'packaging'がでてインストールできない場合

pip install -v --no-cache-dir .

を実行すると以下のようなエラーを吐く場合がありそう。

Running command python setup.py egg_info
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\○○\AppData\Local\Temp\pip-req-build-go7gn159\setup.py", line 4, in <module>
        from packaging.version import parse, Version
    ModuleNotFoundError: No module named 'packaging'

これが出たら大人しくpackagingをインストールしてから、再度pip installを実行すると治った。

$ pip install packaging

参考

NVIDA/apexのgithub

nvidia-cuda-nvcc 0.0.1.dev5