この記事は 2024年8月13日に Codeplay のウェブサイトで公開された「Part Two – Porting AI codes from CUDA to SYCL and oneAPI, one llama at a time」の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。
はじめに
パート 1 では、プロジェクト全体の移行ツールである SYCLomatic を使用した CUDA* から SYCL* への移行について説明しました。パート 2 では、移植可能なコードを NVIDIA* とインテルの GPU で実行します。
NVIDIA* システムでのビルド
SYCLomatic が作成した CMake ファイルを使用して、移行されたコードをビルドし、llama.cpp のメインバイナリーを生成します。
$ cd dpct_out && mkdir syclbuild && cd syclbuild
$ MKLROOT=/home/ruyman/soft/mkl CC=icx CXX=icpx cmake .. -DLLAMA_CUBLAS=ON -DCMAKE_CUDA_ARCHITECTURES=80 -DCMAKE_CXX_FLAGS="-fsycl -fsycl-targets=nvptx64-nvidia-cuda -L${MKLROOT}/lib"
$ make main
ビルドには CUDA* コンパイラーではなくインテルの SYCL* コンパイラーを使用するため、CC
フラグと CXX
フラグを渡していることに注意してください。また、SYCL* コンパイラーに NVIDIA* CUDA* アーキテクチャー (PTX を使用) 向けのコードの生成を指示する -fsycl-targets=nvptx64-nvidia-cuda
を手動で渡しています。次のコマンドを使用して、モデルを実行できます。
$ ONEAPI_DEVICE_SELECTOR=cuda:gpu ./bin/main -m ../../models/ -ngl 12899 -no-mmap
環境変数 ONEAPI_DEVICE_SELECTOR
を使用すると、SYCL* キューのデフォルトの選択メカニズムをオーバーライドして、ユーザー定義の設定を優先できます。デフォルトでは CPU 向けに OpenCL* が使用されますが、この例では NVIDIA* GPU 向けに明示的にビルドします。
移行されたコードは、そのままでは NVIDIA 向けに最適化されたパスを使用しないため、それほど高速ではありません。ただし、これは、インテル® GPU を搭載した新しいマシンに移行する前に、既存の環境で SYCL* コードを試す良い開始点であり、CI インフラストラクチャーを再利用して SYCL* パスをテストすることもできます。
インテル® GPU システムで実行
アプリケーションが真に移植可能であることを実証するため、このコードをビルドしてインテル® GPU 上で実行してみましょう。
新しいシステムで intercept-build
を実行したり、インテル® DPCT で生成されたプロジェクトをコピーできるように、インテル® データセンター GPU マックス・シリーズを搭載したシステムにログオンし、CUDA* のクローンを作成してビルド手順を繰り返します。次に、プロジェクトの移行に使用したオリジナルの CMake フラグを使用して、インテル® GPU 向けに構成してビルドします。
$ CC=icx CXX=icpx cmake .. -DLLAMA_CUBLAS=ON -DCMAKE_CUDA_ARCHITECTURES=80
CUBLAS および CUDA* CMake フラグを引き続き使用します。表示される CMake フラグは同じですが、SYCLomatic によって生成された CMake ファイルの内部ロジックが、インテル® oneAPI ベース・ツールキットの依存関係のパスを検索します。構成が完了したら、次のコマンドを実行します。
$ make main
デフォルトのターゲットであるインテル® GPU (SPIR-V* バイナリーを使用) 向けに llama.cpp がビルドされます。インテル® GPU で Llama* を実行するには、次に示すように、レベルゼロ GPU バックエンドを使用します。
$ ONEAPI_DEVICE_SELECTOR=level_zero:gpu ./bin/main -m ../../llama-2-7b-chat.Q4_K_M.gguf --no-mmap -ngl 128
同じアプリケーションが、ユーザーの介入なしにインテル® GPU 上で実行できます。つまり、すべての面倒な作業はツールによって行われ、生成されたコードの最適化とリファクタリングに集中できます。
まとめ
パート 2 では、AI アプリケーションを CUDA* から SYCL* へ移行する実用的な例を紹介しました。移行は容易で、コード変更は必要ありませんでした。SYCLomatic ツールは、CUDA* から SYCL* へのアプリケーションの移行を支援し、適切な警告メッセージを表示し、後でアプリケーションに適したコードに置き換えることができるコードを挿入します。
本記事ではまた、同じコードが NVIDIA* とインテルの GPU で変更なしで動作することも示しました。同じコードは、オープン・スタンダードの SYCL* により、他の GPU でも動作する可能性があります。llama.cpp にはすでに CUDA* バックエンドがありますが、SYCL* バックエンドを両方のプラットフォームで実行することで、テストに CI インフラストラクチャーを再利用し、少ないコード変更で、アプリケーションをより幅広いプラットフォームで実行できます。
llama.cpp アップストリームでサポートされている現在の SYCL* バックエンドは、ここで紹介したようにインテル® DPCT を利用して移行されました。開発者は、クライアントとデータセンターの NVIDIA* GPU、AMD* GPU、インテル® GPU、RISC-V* など、さまざまなプラットフォームでパフォーマンスを向上させるため、SYCL* バックエンドを改良してきました。SYCLomatic によって生成されたオリジナルのコードの一部は、今でも再利用されています。SYCLomatic によるオリジナルの移行は、一から始める場合と比べて工数を大幅に削減し、開発者はプロジェクトの重要な部分であるパフォーマンスとコードの品質に集中することができました。
CUDA* から SYCL* への移行に関するサポートが必要な場合、またはこの記事の内容について質問がある場合は、dev-rel@codeplay.com までお問い合わせください。
Codeplay Software Ltd has published this article only as an opinion piece. Although every effort has been made to ensure the information contained in this post is accurate and reliable, Codeplay cannot and does not guarantee the accuracy, validity or completeness of this information. The information contained within this blog is provided “as is” without any representations or warranties, expressed or implied. Codeplay Sofware Ltd makes no representations or warranties in relation to the information in this post.