パート 1: CUDA* から SYCL* と oneAPI へ AI コードを移行

AI

この記事は 2024年7月31日に Codeplay のウェブサイトで公開された「Part One – Porting AI codes from CUDA to SYCL and oneAPI, one llama at a time」の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。


はじめに

チャットボット、仮想アシスタント、コンテンツ生成、言語翻訳などで直面する複雑な課題に効果的に取り組むことができる LLM は急速な進歩を遂げています。人間に匹敵するパフォーマンスにより、LLM は AI モデルの最前線に位置付けられています。

PyTorch*、TensorFlow* などの従来の汎用グラフ・フレームワークは、畳み込みニューラル・ネットワーク、再帰型ニューラル・ネットワーク、生成 AI 向けのさまざまな Transformer ベースのアーキテクチャーなど、いくつかのニューラル・ネットワーク (NN) アーキテクチャーを通じて、画像とビデオの分類、セマンティック・セグメンテーション、オブジェクト検出、汎用言語を生成するその他の自然言語処理など、非常に幅広いマシンラーニングの分野をカバーできます。

このような万能なフレームワークは、現在利用されている AI モデルのトレーニングと推論のほぼすべての側面をカバーできますが、シナリオによっては、エッジ・コンピューティングやネットワーク接続のないシステムなど特定のデバイス向けに、特定のタイプの推論専用の NN アーキテクチャーが必要です。このようなアーキテクチャーは、単一の GPU や CPU のみで、メモリーやキャッシュ容量が小さかったり、オペレーティング・システムのサポートが限定的であるなど、ハードウェアの制限により、開発者が使用に苦労する場面があります。

大規模言語モデルの普及に伴い、Meta の Llama* モデル、llama.cpp、vllm など、推論モデル用の Transformer ベースのアーキテクチャーのみをターゲットとするいくつかの軽量フレームワークが提供されています。その中でも、llama.cpp は C++ ベースのオープンソース・ライブラリー (英語) で、Llama* モデルなどで使用できます。これは純粋な C/C++ を使用して記述されており、サードパーティー・ライブラリーへの依存を最小限に抑えた LLM 推論を可能にし、ローカルおよびクラウドベースのさまざまなハードウェアで最先端のパフォーマンスを提供します。

llama.cpp は、GPU を搭載したラップトップやデスクトップ PC など、リソースが限られたデバイスで大規模言語モデルを効率良く実行するように設計されています (英語)。C++ ベースの実装により、llama.cpp はパフォーマンスと移植性が高く、計算能力とメモリーが重視されるシナリオに最適です。llama.cpp の中核となるのは量子化です。llama.cpp は、カスタム量子化タイプを使用してモデルのサイズを大幅に縮小し、メモリーが限られたデバイスでもモデルを実行できるようにします。それには、出力でハルシネーション (幻覚) を起さずに精度の低下を防ぐ適切な量子化スキームを見つけることが課題となるため、モデルの調整に労力を要し、いくつかのカスタム行列乗算操作を使用してカスタム量子化スキームによる精度低下を軽減する必要があります。

SYCLomatic

この記事では、オープンソースの SYCLomatic ツール (英語) を使用して、既存の llama.cpp CUDA* バックエンドを SYCL* に移行する方法を説明します。移行されたコードは、NVIDIA* システムと、インテル® データセンター GPU マックス・シリーズを搭載したシステムで実行でき、真に移植可能な単一ソースコードを実証するものです。

注: インテルと Codeplay のチームにより、llama.cpp にはすでに SYCL* がアップストリームされているため、この移行を実際に行う必要はありません。この作業は、2023年12 月に SYCLomatic* による変換から始まり、変換によるフィードバックを基に、SYCLomatic は大幅に改善されました。SYCL* アップストリーム・サポートは現在、Codeplay とインテルが NVIDIA* とインテルの GPU の両方を管理しています。

SYCLomatic の主な利点は、プロジェクト全体の移行ツールであることです。つまり、個々のカーネルやファイルの移行ではなく、SYCL* マルチターゲット・アプリケーションの開始点として使用できるプロジェクト全体の移行を提供します。

準備

この演習では、2 つの異なるマシンを使用します。1 つは NVIDIA* GPU を搭載したローカル・デスクトップ PC、もう 1 つはインテル® データセンター GPU Max 1110 を搭載したリモートシステムです。

両方のシステムに最新の CUDA* ツールキットとインテル® oneAPI ベース・ツールキット 2024.2 をインストールしました。

使用するすべてのツールがパスに含まれるように環境変数を設定することを忘れないでください (最初のパスをインテル® oneAPI ベース・ツールキットのパスに置き換えます)。

$ cd /path/to/intel/oneAPI/Toolkit
$ . setvars.sh  ~/intel/oneapi
$ dpct --versionIntel(R) DPC++ Compatibility Tool version 2024.2.0. Codebase:(55a3f034030e4bd0f36d7c37f24f8366079a639b). clang version 19.0.0

モデルを実行する前に、モデルをダウンロードする必要があります。llama.cpp は多くのモデルをサポートしており、リストは増え続けています。この例では、手間を省き、プロンプトから wget するだけで済むように、「gguf」形式で量子化された Llama–2–7B モデルをダウンロードします。この例では、HOME フォルダーにモデルのディレクトリーを作成します。

$ mkdir $HOME/models/ ; cd $HOME/models/ 
$ wget https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF/resolve/main/llama-2-7b-chat.Q4_K_M.gguf

NVIDIA* システムでは、NVIDIA* GPU 向けの oneMKL のローカルコピーが必要です。これは現在、ダウンロードできないため、次のようにビルドする必要があります。

$ git clone https://github.com/oneapi-src/oneMKL.git

$ cd oneMKL/; mkdir build; cd build

$ cmake ../    -GNinja     -DCMAKE_CXX_COMPILER=icpx     -DCMAKE_C_COMPILER=icx     -DENABLE_MKLGPU_BACKEND=False     -DENABLE_MKLCPU_BACKEND=False     -DENABLE_CUFFT_BACKEND=True     -DENABLE_CUBLAS_BACKEND=True     -DENABLE_CUSOLVER_BACKEND=True     -DENABLE_CURAND_BACKEND=True     -DBUILD_FUNCTIONAL_TESTS=False -DCMAKE_INSTALL_PREFIX=${HOME}/soft/mkl/ $ ninja install 

NVIDIA* 向けの oneMKL インターフェイス (英語) がビルドされ、HOME ディレクトリー内の soft/mkl ディレクトリーにインストールされます。

変換の手順

最初の手順は、以下に示すように、llama.cpp リポジトリーをクローンし、通常どおり NVIDIA* GPU 用に cmake を構成することです。

$ git clone https://github.com/ggerganov/llama.cpp.git

$ cd llama.cpp

$ git checkout 3c04bf6da89eaf4c7d317e0518f0687dfcbf2de7

$ mkdir build && cd build

$ cmake .. -DLLAMA_CUBLAS=ON -DLLAMA_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=80

この例では、最初の移行に使用したバージョンに近い、llama.cpp リポジトリーにあるバージョンを使用します。llama.cpp プロジェクトは進化が速く、最新バージョンはそのままでは SYCLomatic では動作しない可能性があります。

最初の変更点は、次のように、通常実行する make コマンドの前に「intercept-build」を追加します。

$ intercept-build make 

intercept-build は、SYCLomatic とともに配布される非常に便利なツールで、yaml ファイルのビルド中に発行されたすべてのコンパイルコマンドを収集します。SYCLomatic は、この yaml ファイルを使用して、アプリケーションの SYCL* バージョンをコンパイルする新しいビルド・システム・ファイルを生成します。

次に、intercept-build によって収集された情報を使用して、dpct ツールを実行して SYCL* ビルド・ディレクトリーを生成します。

$ cd ../.. && mkdir dpct_out

$ dpct -p ./llama.cpp/build --enable-profiling --use-experimental-features=all --in-root=./llama.cpp --out-root=./dpct_out --migrate-build-script=CMake --process-all 

-p オプションを使用すると、コンパイル・データベースを検索して、それを使用してすべてのプロジェクト・ファイルが変換されます。この例では、プロファイルも有効にし (SYCL* 生成コードにプロファイル情報を追加します)、すべての実験的機能 (これについては後述します) も選択しています。また、CMake を使用してビルドスクリプトを移行し、すべてのファイルを処理するように指示しています。

次のステップ

これで、llama.cpp プロジェクトを CUDA* から SYCL* に変換することができました。パート 2 では、変換したコードを NVIDIA* とインテルの GPU でビルドして実行します。


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.

タイトルとURLをコピーしました