見出し画像

Windows PC上でxFormersをビルドしてインストールする手順

※最近の更新
03-21-2023:現在はパッケージが用意されていて、「pip install xformers」等のコマンドでインストールできます。そのため、通常は自分でビルドする必要はありません。また、ビルドに関する内容は、執筆当時の情報に基づいています。

1. 概要

はじめに

 本記事では、Windows PC上でMeta ResearchのxFormersをビルドしてパッケージを作成し、インストールする手順を説明します。

 なお、現在はWindows対応のパッケージが用意されており、「pip install xformers」等のコマンドでインストールできます。少し古いバージョンについても、下記の記事からパッケージを探すことができます。

 よって、何らかの理由で既存のパッケージが利用できないか、単に自分でビルドしてみたい方以外は、ビルドを行う必要はありません。

ディレクトリ構成

 本記事での作業ディレクトリは「\aiwork」です("\" は半角の "¥"と同じ)。構成は以下のとおりです。

\aiworkディレクトリ内の構成

xformers\                 xFormersビルド用(ビルド後は削除可)
xformers\venv\            xFormersビルド用の仮想環境(同上)
xformers-~~~~~~~.whl      ビルドしたパッケージ(この場所に待避する)

 本記事ではこれだけしか使用しませんが、web UIやDreamBoothにおいても「\aiwork」を使用するため、このような構成になっています。

ビルドを行ったPCの環境

 検証時の環境ですが、OSはWindows 10(22H2)、Pythonは3.10.8、GeForceのドライバーは511.65(ただし最新版を推奨)、CUDA Toolkit(以下、CUDA)は11.6.2を使用しました。

2. ツールの準備

 まず、ビルドに必要なツールの導入を行います。導入済みの場合は読み飛ばしてください。

Python 3.10のインストール

 バージョンは3.10固定とします。バージョン3.7~3.9でもビルドできると思いますが未確認です。3.11については「不明」です(導入可能なtorchが2.0.0以上となっています)。

 以下のリンク先より、Python 3.10(12-15-2022時点での最新バージョンは3.10.9)のインストーラーを「Download Windows installer (64-bit)」の箇所からダウンロードして実行します。

https://www.python.org/downloads/windows/

 Pythonのインストール開始時に、「Add python.exe to PATH」にチェックを入れてください。あとは、そのままインストールを進めると完了します。

Gitのインストール

 以下のリンク先より、Git(12-15-2022時点の最新バージョンは2.39.0)のインストーラー(「Standalone Installer」の「64-bit Git for Windows Setup.」)をダウンロードして実行してください。色々と尋ねられますが、そのままインストールを進めて構いません。インストール完了時に、「View Release Notes」のチェックを外すと良いでしょう。

https://git-scm.com/download/win

CUDA 11.6のインストール

 CUDA 11.3が使用できる可能性はありますが、筆者の環境ではOS再インストール後にビルドできなくなってしまったので、11.6を選択しています(追記:11.8でのビルドも確認しました)。

 それでは以下のリンク先より、CUDA 11.6.2のインストーラーをダウンロードして実行してください。

https://developer.nvidia.com/cuda-toolkit-archive

 今回の目的のみで使用する場合は「カスタム」を選んで、インストールオプションでは一段目のチェックをすべて外し、「CUDA」の下にある「Runtime」「Development」「Visual Studio Integration」のみチェックを入れてください。

CUDAインストールオプションの選択

 なお、CUDAのバージョンによって、GeForceのドライバーのバージョンに制限があります(CUDA 11.6の場合は511.65以上)。インストールオプションの「Driver Components」を開いてみて、「現在のバージョン」の方が低ければチェックを入れると一緒に更新してくれます。ただし、なるべく事前に最新版をインストールしておくことを推奨します。以下のURLからダウンロードしてください。

https://www.nvidia.co.jp/Download/index.aspx?lang=jp

Build Tools for Visual Studio 2022のインストール

 以下のリンク(Visual Studioのダウンロードページ)を開いて下にスクロールすると、「すべてのダウンロード」内に「Build Tools for Visual Studio 2022」があるのでダウンロードして実行してください(ファイル名「vs_BuildTools.exe」) 。

https://visualstudio.microsoft.com/ja/downloads/?q=build+tools

 もし見つからなかった場合は、通常のダウンロードページのURLを開いて下にスクロールして、「Visual Studio 2022用のツール」の項目を開くとあります。

 インストール内容を選ぶ画面では、「C++によるデスクトップ開発(Desktop development with C++)」にチェックを入れてインストールを続けてください。現在はオプションで「Windows 11 SDK」が選択されていますが、PCのOSに合わせて「Windows 10 SDK」を選びなおす必要は無いようです。リスト中のいずれかのSDKにチェックがあればビルドできます。

「C++によるデスクトップ開発」にチェックを入れる

 ダウンロードサイズは1.7GB以上、必要な領域は7GB以上を見込みます。インストールには少し時間がかかります。

ninjaのインストール(オプション)

 ninjaを使用すると、ビルドがかなり高速化するのでインストールをおすすめします。ninjaを使用するために設定を変える必要はなく、xFormersのビルド時に自動的に使用されます。

 以下のリンク先から「ninja-win.zip」(12/15/2022時点での最新バージョンはv1.11.1)をダウンロードして、中に入っている「ninja.exe」をパスの通ったディレクトリにコピーしてください。あまり良くない方法ですが、一時的に「C:\Windows」等へコピーして、使い終わったら削除する方法が簡単です。

https://github.com/ninja-build/ninja/releases

 コマンド プロンプトやPowerShellで以下のコマンドを実行して、usageが表示される(パスが通っている)ことを確認してください。

ninja -h

 以上で、ツールの準備は完了です。

3. ビルド作業

 ここから先はコマンド プロンプトを使用します(管理者アカウントであれば特別な権限は不要、ユーザーアカウントは未確認)。PowerShellでも構いませんが、一部コマンドや体裁の違いがある場合のフォローが不十分かもしれません。また、作業に使用したいドライブやディレクトリが異なる場合は、適宜読み替えてください。

 まず、Cドライブに「aiwork」ディレクトリが無ければ作成して(mkdirコマンドでも構いません)、コマンドプロンプト上で「cd \aiwork」のコマンドを実行してください。以下の3行目のような表示が出て、作業ディレクトリに移動していることを確認してください。

cd \aiwork

C:\aiwork>

 これ以降は基本的に、入力するコマンドのみを記載します。頭に「#」がある行はコメントですので入力しないでください。

xFormersのダウンロード

 以下のコマンドは、「xformers」ディレクトリが無い状態で実行してください。「git clone」コマンドでxFormersをダウンロードしてから「xformers」ディレクトリに移動し、submoduleを更新します。

git clone https://github.com/facebookresearch/xformers.git
cd xformers
git submodule update --init --recursive

 現時点では、これをビルドするとxFormersのバージョンが「0.0.15.dev0」になります。上記の1行目を以下に差し替えると「0.0.14.dev0」になります。こちらはweb UI向けのパッケージを作成したフォーク版で、どちらを使用しても差し支えは無いと思います。

git clone https://github.com/C43H66N12O12S2/xformers.git

 以下のコマンドを実行して、xFormersをビルドするための仮想環境を作ってactivateを行います。仮想環境に入ると、行頭に「(venv)」などの表示が追加されるので一目で分かります。一連のビルド作業が終わるまでは、仮想環境に入ったままにします。

python -m venv venv
venv\Scripts\activate
python.exe -m pip install --upgrade pip

 やむを得ず作業の途中で中断した場合は、再開時に「xformers」のディレクトリまで移動してから「venv\Scripts\activate」を実行してください。

PyTorchのインストール

 以下のコマンドで、PyTorch(torchとtorchvision)をインストールしてください。今回の目的上、web UIの動作環境とDiffusers(DreamBoothを含む)の動作環境を考慮して、CUDA 11.6用ではなく11.3用を使用し、torchとtorchvisionのバージョンを指定します。

pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113

ライブラリのインストール

 以下のコマンドを実行して、必要なライブラリをインストールします。

pip install -r requirements.txt
pip install wheel

ファイルの修正

 このままではビルドの最後でリンクに失敗してしまったので、テキストエディタで「aiwork\xformers\venv\Lib\site-packages\torch\include\ATen\Parallel.h」を開き、lazy_init_num_threads()の中身をコメントアウトして空にします。具体的には、以下の3~7行目の行頭に「//」を加えています。

// Initialise num_threads lazily at first parallel call
inline TORCH_API void lazy_init_num_threads() {
//  thread_local bool init = false;
//  if (C10_UNLIKELY(!init)) {
//    at::init_num_threads();
//    init = true;
//  }
}

 これでビルドできるようになり、動作も支障ないようなので大丈夫だと思います(情報元は末尾の関連情報にて)。

GPUの世代を指定(オプション)

 これは行わなくても構いません。対応させたいGPUの世代を1つだけ指定してやると、生成されるwhlファイルが小さくなる場合があります。逆に、複数のGPU世代を指定することもできます。

 上記のURLへアクセスして、使用する(したい)グラフィックボードを探してください(GeForceの場合は「CUDA-Enabled GeForce and TITAN Products」を開く)。名前の横にある「Compute Capability」の値がGPUの世代です。例えば、GeForce RTX 3xxxであれば8.6です。

 世代が分かったら、以下のコマンドで環境変数を設定します。先にも書きましたが、頭に「#」のある行はコメントですので入力しないでください。

#コマンド プロンプトの場合
set TORCH_CUDA_ARCH_LIST=8.6
 
#PowerShellの場合
$env:TORCH_CUDA_ARCH_LIST = "8.6"

 対応したいGPU世代を増やしたい場合は「;」で区切って列挙します。以下は一例ですが、増やした分だけビルドにかかる時間が増えてファイルサイズも増加します。通常は必要最小限にとどめることを推奨します。

#複数指定の例(コマンド プロンプトの場合)
set TORCH_CUDA_ARCH_LIST=6.0;6.1+PTX;6.2;7.0+PTX;7.2;7.5+PTX;8.0;8.6+PTX

#複数指定の例(PowerShellの場合)
$env:TORCH_CUDA_ARCH_LIST = "6.0;6.1+PTX;6.2;7.0+PTX;7.2;7.5+PTX;8.0;8.6+PTX"

 なお、PyTorchが対応しているGPUの世代は、「\aiwork\xformers\venv\Lib\site-packages\torch\utils\cpp_extension.py」の「supported_arches =」のあたりに記述があります。3.5から8.6まで列挙されていたので、PyTorch自体は(バージョンによるかもしれませんが)GeForce GTX 700 SeriesからRTX 30 Seriesまで対応しているようです。

ビルド実行

 強制的にBuild Toolsを使用させるため、以下のコマンドを実行してください。先にも書きましたが、頭に「#」のある行はコメントですので入力しないでください。

#コマンド プロンプトの場合
set NVCC_FLAGS=-allow-unsupported-compiler
 
#PowerShellの場合
$env:NVCC_FLAGS = "-allow-unsupported-compiler"

 以下のコマンドを実行してビルドを行ってください。1行目が実際のビルドで時間がかかります。例としてRyzen 7 5800Xの場合、ninja導入時は10分間、未導入時は1.5時間とのことです。Ryzen 5 3600では、ninja導入時は13分間でした(TORCH_CUDA_ARCH_LIST未指定の場合)。ビルド中はCPUの負荷が上がり、さらにPCの動作が一時的に止まることがあります。

python setup.py build
python setup.py bdist_wheel

 ビルドが正常に完了した場合、上記の2行目を実行すると「\aiwork\xformers\dist」のディレクトリが生成され、中に「xformers-~~~~~~~.whl 」というファイルが保存されます(通常は27~90MB程度)。本記事で目的とする生成物ですので、「\aiwork」に待避(移動)してください。

 以下のコマンドでビルド用の仮想環境から抜けると、ビルド作業はすべて完了です。

deactivate

 ビルド作業を終えたら、「xformers」ディレクトリは必要ないので削除しても構いません(仮想環境も同時に消えます)。

4. 関連情報

参考にしたページ

web UIにxFormersを新規インストールする手順

 web UIの仮想環境に、今回ビルドしたパッケージをインストールします。なお、web UIを利用する手順については以下の記事で説明しています。

 xFormersのインストールに話を戻しますが、一度もweb UIを正常起動(Webブラウザを待ち受ける状態にする)したことが無い場合はインストールできませんのでご注意ください。

 インストールの手順は、以下のコマンド例を参考にしてください。web UIやwhlファイルのディレクトリ、ファイル名が異なる場合は適宜読み替えてください。

cd \aiwork\stable-diffusion-webui
venv\Scripts\activate
pip uninstall xformers
pip install --no-deps \aiwork\xformers-0.0.14.dev0-cp310-cp310-win_amd64.whl
deactivate

 手順を列挙すると、web UIのディレクトリに移動して、web UI専用の仮想環境に入り、既存のxFormersがあればアンインストールして(確実に無い場合は実行しなくても良い)、今回ビルドしたパッケージをインストールして、仮想環境から抜けています。

 web UIでxFormersを使用したい場合は、起動用のバッチファイルに以下のオプション指定を加えてください。

set COMMANDLINE_ARGS=--xformers

 xFormers使用の有無は、web UIの画面の最下部に表示されるほか、コマンド プロンプトに出てくる表示でも分かります。

#--xformers未指定時
Applying cross attention optimization (Doggettx).

#--xformers指定時
Applying xformers cross attention optimization.。

特定の環境に直接ビルドする方法

 特定の環境にxFormersをそのままインストールしたい場合は、その環境に入った状態でビルド作業の手順を進めます。そして、以下を参考に実行するコマンドを変更してください(動作未確認)。

#ビルド作業の手順で以下のコマンドは実行しない
python setup.py build
python setup.py bdist_wheel

#代わりに以下のコマンドでインストールを行う
pip install -e .

 この方法ではせっかくビルドしたxFormersの使い回しができないので、パッケージを作成する方法をおすすめします。

別のバージョンのPythonやtorchを使用してビルドする場合

 冒頭の「README」で触れたとおり、本記事は「Python 3.10」上で「CUDA 11.3用のtorch 1.12.1」を使用する前提で書きましたが、他の選択肢もありますので説明します。

 ビルドの際は、「xFormersのパッケージをビルドする環境でのPyTorchのバージョン」を、「xFormersのパッケージをインストールする環境でのPyTorch(torch)のバージョン」に合わせる必要があります。相違があると正しく動作しない恐れがありますのでご注意ください。

 Python 3.7~3.10では以下のtorchが使用できるようです(12/15/2022時点、torch 1.12.0以下は割愛)。

torch==1.12.1 torchvision==0.13.1 / cu113

torch==1.12.1 torchvision==0.13.1 / cu116
torch==1.13.0 torchvision==0.14.0 / cu116
torch==1.13.1 torchvision==0.14.1 / cu116

torch==1.13.0 torchvision==0.14.0 / cu117
torch==1.13.1 torchvision==0.14.1 / cu117

 上記を参考に使用するtorchを選び、「PyTorchのインストール」に記載されている以下のコマンドを書き換えて実行してください。それ以外の手順に変更はありません。

pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113

 既にPyTorchがインストールされている場合は、以下のコマンドのようにインストールし直してください。

uninstall torch torchvision
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113

 なお、Python 3.11ではWindows版のPyTorchが存在しませんでした(追記:torch2.0.0が対応しているようです)。

5. twitterの連絡先

 noteのアカウントはメインの@Mayu_Hiraizumiに紐付けていますが、記事に関することはサブアカウントの@riddi0908までお願いします。

この記事が気に入ったらサポートをしてみませんか?