Showing posts with label Windows. Show all posts
Showing posts with label Windows. Show all posts

Win11でJAX!

OpenAIのwhisperをpytorchからjaxに書き直して70倍速くなった (sanchit-gandhi/whisper-jax)というニュースでjaxに興味持ちました。 実のところ、pytorch→jaxの寄与分は、この70倍のうち2倍とのことなのですが、それでもかなりのパフォーマンスです。

まずはjaxの手配から。WSL2 or Dockerとも思いましたが、Windowsネイティブで実行を目指しました。

jaxのビルド(Windows)

jaxはWindows向けに公式バイナリが配布されておらず、自分でビルドする必要があります。少し前までコミュニティビルドバイナリがあったようなのですが、23年4月30日現在、jaxlib 0.3.17+CUDA 11.1などバージョンが古いものしか見当たりません。

ビルド環境

コンパイラのバージョンの組み合わせなどによってビルドが通ったり通らんかったりしそうなのでメモしておきます。

このほか大事な点
  • Win 11の設定で開発者モードを有効にする
  • Bazelのバージョンは大事。bazeliskを使うと良いバージョンのbazelを選んでくれる。
  • realpathなど、bash系のコマンドを導入すること。Git bash付属のものを利用可能。(msys2のScoopならC:\Users\{ユーザ名}\scoop\apps\msys2\2023-03-18\usr\binなど)
  • jaxのクローンはできるだけドライブ直下に。パス長がギリギリになる。
  • exFATのドライブを使うとSynbolicLinkを作れないのでエラーが出る
  • サブコンポになってるTensorFlowなどがVC2022に対応してないかも (Issue #60062 · tensorflow/tensorflow). 必要に応じて環境変数BAZEL_VCを定義する(C:\Program Files(x86)\Microsoft Visual Studio\2019\BuildTools\VC)
私が確認した範囲ではjaxlib v0.3.24+ CUDA 11.7がWindowsでビルドできる最新の組み合わせでした。v0.4.7やCUDA 12.1はダメそう。

WindowsをP3MV3(1.6 USD/hr)をSelf-Hostedするお金があったらMatrix作って確かめます!

Git bash付属のコマンド類

Bazelの公式ではmsys2と書かれているがgit bashと周辺ツールのほうが素性が良さそうで、このあたりが使えるよう環境変数の$env:pathに追加します。

  • C:\Program Files\Git\cmd
  • C:\Program Files\Git\mingw64\bin
  • C:\Program Files\Git\usr\bin

追加後、特にBazelが使いたがるrealpathが動作すれば良い。

あわせてBAZEL_SH=C:\Program Files\Git\usr\bin\bash.exeとしておく。

ビルド作業

環境を整えたあと、ビルド。condaはjax用に環境つくっておきました。

conda create -n jax python=3.10
conda activate jax
conda install numpy

cd d:/
git clone https://github.com/google/jax.git
cd jax
git checkout jaxlib-v0.3.24
python .\build\build.py --enable_cuda `
  --cuda_path="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.7" `
  --cudnn_path="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.7" `
  --cuda_version="11.7" --cudnn_version="8.5.0" --bazel_statup_options="--output_user_root=d:/tmp" `
  --bazel_path="D:/bazel.exe"

ビルド時間はCore i7 10th Gen(8 Core)で3時間くらいというとこでしょうか。

途中、CUDAコードのビルド時に依存パッケージの文字コード警告が出て、その後エラーが出てしまうことがありました。

external/org_tensorflow/tensorflow/compiler/xla/stream_executor/gpu/asm_compiler.cc(1): warning C4819: The file contains a character that cannot be represented in the current code page (932). Save the file in Unicode format to prevent data loss
...(中略)...
external/org_tensorflow/tensorflow/compiler/xla/stream_executor/gpu/asm_compiler.cc(106): error C2065: 'ptxas_path': undeclared identifier
...(後略)...

こちらはコンパイラの警告 (レベル 1) C4819 | Microsoft Learnに従って、asm_compiler.ccをBOM付UTF8(さらに念のため改行コードをCRLFに変換)し、build.pyを実行するコマンドを繰り返すことで完了までたどり着きました。 当該ファイルに変な文字が入っているようには見えなかったので不思議です。

最後までビルドが通ると下記ログがでます。

C:\Users\chachay\miniconda3\envs\jax\lib\site-packages\setuptools\command\install.py:34: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
warnings.warn(
C:\Users\chachay\miniconda3\envs\jax\lib\site-packages\wheel\bdist_wheel.py:83: RuntimeWarning: Config variable 'Py_DEBUG' is unset, Python ABI tag may be incorrect
if get_flag("Py_DEBUG", hasattr(sys, "gettotalrefcount"), warn=(impl == "cp")):
Output wheel: D:\jax\dist\jaxlib-0.3.24-cp310-cp310-win_amd64.whl

To install the newly-built jaxlib wheel, run:
  pip install D:\jax\dist\jaxlib-0.3.24-cp310-cp310-win_amd64.whl

余談

github actionでバイナリ作ろうとしたらホストのメモリが足りずヒープエラーで強制終了したのですが、

  1. github actionでページングを有効化する(actions/configure-pages)
  2. BAZELの最大利用メモリを制限する.--local_ram_resources=2048(TF - Bazel Build options)
といった方法で解決できるそうです。ちなみに1を使いました。ただ、Github actionが360分でタイムアウトするので工夫が必要かなと思います。

whl配布するならselfhosted serverが欲しくなります…。

インストール

完成品のjaxlibはd:/jax/distにあります。jaxやflaxとあわせてインストールします。

cd d:/jax/dist
conda activate jax
pip install flax==0.6.4 . .\dist\jaxlib-0.3.24-cp310-cp310-win_amd64.whl

Bazelのキャッシュをきれいにするなら

bazel clean
bazel shutdown

jaxの試食

動作するか確認します。付属のサンプルスクリプトを走らせます。

python .\examples\kernel_lsq.py
MSE: 3.916308e-08

jaxpr of gram(linear_kernel):
{ lambda ; a:f32[100,20]. let
    b:f32[100,100] = dot_general[
      dimension_numbers=(((1,), (1,)), ((), ()))
      precision=(<Precision.HIGH: 1>, <Precision.HIGH: 1>)
      preferred_element_type=None
    ] a a
  in (b,) }

jaxpr of gram(rbf_kernel):
{ lambda ; a:f32[100,20]. let
    b:f32[100,1,20] = broadcast_in_dim[
      broadcast_dimensions=(0, 2)
      shape=(100, 1, 20)
    ] a
    c:f32[1,100,20] = broadcast_in_dim[
      broadcast_dimensions=(1, 2)
      shape=(1, 100, 20)
    ] a
    d:f32[100,100,20] = sub b c
    e:f32[100,100,20] = integer_pow[y=2] d
    f:f32[100,100] = reduce_sum[axes=(2,)] e
    g:f32[100,100] = neg f
    h:f32[100,100] = exp g
  in (h,) }

動いた! 寝る!

参考

NVIDIA DIGITS 6.0をWindowsで使う!

はじめに

以前のブログにてDIGITS4.0をWindowsにインストールする手順を取り上げてから2年立ちましたが、ディープラーニングの普及は益々進み、 老若男女問わずこの技術の習得に関心が高まるこのごろですね。 そんな中、「プログラミングができなくてもディープラーニングできるよ!」という触れ込みでNVIDIA社さんがトレーニング(通称DLI)をオンラインや特別イベントなどでも主催し、少なからずAIに触ったという方は増えてきている様子ですが、 環境構築の面では未だまだ敷居が高いようです。 なにより厳しいのは一般企業の方は"Windows文化"ですよね。WindowsでのノンプラグラミングディープラーニングはSONYさんのNNablaもありますが、特にDLIを受講された方はDIGITSの方になれていると思いますので、内容を少しブラッシュアップしました。

DIGITSは5.0でも6.0でも良いですが、GANをやりたいときは6.0らしいっす。新しいのにしておきましょう。

環境

必須

Anaconda/MinicondaのPythonは2でも3でも良いですが、私自身はPython3.X (現時点では3.6)を普段はメインで使っており将来性の観点から3.Xの導入をおすすめします。

インストール時にAdd Anaconda to my PATH environment variableを有効にしてください.

推奨

これからインストールするもの

CaffeはNVIDIAがお手入れしている通称NVCaffeが一番良いのですが、WindowsでCaffeビルドするのが少し骨だと思いますので、Prebuild版で済ませます。

PowerShellの準備

以降、コマンドプロンプトかPowerShellを使います。PowerShellを前提に書いていくので、こちらを使う場合、機能制限を取っ払ってくださいね。

WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する:Tech TIPS - @IT

Microsoft Visual C++ Compiler for Python 2.7

python 2.7で使うコンパイラの入手とインストールをしておきます

こちらから入手http://aka.ms/vcpython27

Caffeの導入

別途用意したNVCaffeを使います。GPU版かCPU only版かはご自分の環境に合わせてどちらか一つを選択。Chachay/caffe: Caffe: a fast open framework for deep learning.

ダウンロードが終わったら、C:\CaffeやD:\CaffeなどにZipを展開します。好きなところで良いですがPathにスペース(" ")が含まれないほうが楽でしょう。展開後は下記のような構成になっているはず。あとでPATHを使いますので覚えといて。

C:\CAFFE
├─bin
├─include
├─lib
├─python
└─share

Graphvizのインストール

condaのパッケージにありましたね。

conda install graphviz
dot -V

dot -Vが通らなければ、anacondaインストール時に環境変数を設定してなかったことが原因だと思いますので、直してください

生でインストールする場合はこちら

Graphviz - Windows Packagesからダウンロードしてきて、インストール。インストール先を環境変数PATHにbinフォルダを追加します。 こちらのページが詳しいです。

Graphvizインストール手順

DIGITSのクローン

DIGITSを置きたいフォルダでPowerShellを開きます。フォルダのところでShift押しながら右クリックして「PowerShellウィンドウをここで開く」

git clone -b digits-6.0 https://github.com/NVIDIA/DIGITS.git
# DIGITS 5.0を使いたいときは
# git clone -b digits-5.0 https://github.com/NVIDIA/DIGITS.git

zipで落とすならこちら

Python2.7 仮想環境の構築

便利ファイルのダウンロード

以下のレポジトリからrequirements_conda.txt, requirements_pip.txtを入手してください。私のAnaconda環境が悪いのかconda create --file env.ymlがうまく動かなかったので、 マニュアルな方法を案内いたしますが、env.yml読めそうな人は同梱のymlで試してみてください。

Chachay/DIGITS_Windows_Packages

パッケージ類のインストール

DIGITSのオリジナルで付属しているrequirements.txtは、Windowsでは動作が怪しいパッケージだったり、 BVLC版Prebuild Caffeとの相性だったりが悪いので手直ししたものを使います。

もしcondaをpowershellに対応させてなかったら初期化を実行し、一旦閉じます。

conda init powershell

powershellを開き直して続きをします。

git clone https://github.com/Chachay/DIGITS_Windows_Packages
cd DIGITS_Windows_Packages
conda create -n DIGITS python=2.7
conda activate DIGITS
conda install -c free --file requirements_conda.txt --yes
pip install -r requirements_pip.txt

scikit-fmmが謎の問題をconda上で起こしますので、手直しします。参考:wheel files not working on Conda with Windows · Issue #27 · scikit-fmm/scikit-fmm

pip uninstall scikit-fmm
pip install --no-binary :all: scikit-fmm
cd ..

さらにGPUを利用する場合はCUDA10.1ツールキットを入れます。

conda install cudatoolkit=10.1.168

仮想環境の環境変数設定

CaffeのバイナリとPyCaffeへのPathを通します

$tmpPythonPath = (gcm python).Definition
$tmpPythonPath = $tmpPythonPath.Substring(0, $tmpPythonPath.Length - 10)
pushd $tmpPythonPath # 仮想環境のルートフォルダまで移動
mkdir .\etc\conda\activate.d
mkdir .\etc\conda\deactivate.d
New-Item -type File .\etc\conda\activate.d\env_vars.ps1
New-Item -type File .\etc\conda\deactivate.d\env_vars.ps1

で、両方のフォルダのenv_vars.batを編集します。

activateの方. Caffeの置き場は覚えていますね?

ファイルを開きます。vimなどを持っていれば、そちらを使って下さい。

notepad .\etc\conda\activate.d\env_vars.ps1

env_vars.ps1のファイルの中身はこちらの通り。

$env:PYTHONPATH="C:\caffe\python;" + $env:PYTHONPATH
$env:OLDPATH=$env:PATH
$env:PATH=$env:ProgramFiles + "\NVIDIA Corporation\NVSMI;" + $env:PATH + ";C:\caffe\bin"

deactivateの方も同様に。似てますけど…

# set PYTHONPATH=%PYTHONPATH:C:\caffe\python:=%
$env:PATH=$env:OLDPATH
$env:OLDPATH=

DIGITS起動

新しくPowerShellを開き直し、git cloneした中に入ってください。

cd digits
ls # .githubに続いてdigitsフォルダが見えるはず…
# digitsの学習結果等保存するフォルダ
mkdir c:\digits\jobs
# DIGITSのために作ったpython仮想環境の有効化
conda activate DIGITS
$env:DIGITS_JOBS_DIR=c:\digits\jobs
# digits起動
python -m digits

ブラウザでhttp://localhost:5000/へアクセスするとDIGITSのホーム画面に。

注意事項

本家BVLCのWindowsブランチが賞味期限切れとなり、プリビルドのバイナリを入手できなくなっています。

今後入手が難しいことが出てきたらBVLC/caffe at windowsの説明の通り本家版Windowsブランチを自分でビルドするか、NVCaffe 0.15をWindowsでビルド(GPU対応) - Qiitaを参照してください。

参考

NVIDIA DEEP LEARNING INSTITUTE TRAINING CATALOG
DLIのコースカタログです。入門者向けはDIGITSを利用したものが多めです。
User Guide — virtualenv 16.0.0 documentation
PowerShellのスクリプト実行ポリシーについて
Managing environments — Conda documentation
activate時にスクリプトを実行する方法