MKUBOS上で言語モデルを動かす - takgto/utokyo-chipathon2023 GitHub Wiki

LLMをMKUBOS上で動作させます。

以下のサイトを元にしています。LLMの説明や実装方法等の解説もあるので、参考にしてください。
言語モデルを高位合成でFPGAに実装してみた

swanは、上記サイトの著者が作成した言語モデル(LLM)です。実行すると、英語で物語を作ってくれます。
KV260上で動作させることができますが、KV260はリソースが少なく、改善が難しいです。そこで、リソースのより大きいMKUBOSに実装したいのですが、KV260とMKUBOSは乗っているFPGAや基板の配置が異なります。ここではMKUBOSにswanを実装する方法を示します。
FPGAに実装して実行すると、PCで行った場合と比べてかなり遅いです。実行すると最後に動作速度が表示されるので、できるだけ早くなるように改善してみてください。

TAに「MKUBOS上でswanを動かしたい」と伝えてもらえたら、MKUBOSの基板とUSBをお渡しします。
USBに必要なファイルとVitis 2022.2が入っています。

先に進めていくと、期待通りに動かないことがあります。その時は以下のページに解決方法があるかもしれません。
MKUBOS swan 解決策メモ
解決しなかったり分からなかったりしたらTAを呼んで訊いてください。

1. Vitis 2022.2をマウントする

MKUBOS swanのプラットフォームはバージョンが2022.2のVitisとVivadoで作られています。PCに入れているのは2022.1なので、このままではビルドできません。
MKUBOSと一緒に渡したUSBにVitisとVivadoの2022.2が入っているので、これをマウントして動かします。マウントすると2022.1は起動できなくなります。

1.1 WSLにUSBを認識させる

Windows PowerShellを管理者権限で起動します。検索窓にPowerShellと入れると出てくるので、右クリックメニューから[管理者として実行]を選びます。
「このアプリがデバイスに変更を加えることを許可しますか?」と聞かれるので、[はい]をクリックしてください。
コマンドプロンプトが表示されたら、以下のコマンドを入力します。

PowerShell

Get-Disk

すると、以下のような表示が出てきます。

getdisk Total Sizeが1TB近いメモリのNumberを確認してください。画像では1です。
確認出来たら、以下のコマンドを入力します。

PowerShell

wsl --mount \\.\PHYSICALDRIVE1 --bare

もし、確認したNumberが1以外の場合は上記のコマンドの1のところを該当の番号にしてください。

1.2 WSLのtoolsディレクトリにUSBをマウントする

ここからは、WSLに入力します。
まず、以下のコマンドを入力します。

ubuntu小

lsblk

すると、以下のような表示になります。
lsblk
SIZEが1TB近いメモリのNAMEを確認します。この場合はsde1となっています。

以下のコマンドでtoolsディレクトリにUSBをマウントします。これにより、toolsディレクトリを見ると元のtoolsの中身の代わりにUSBの中身が見えるようになります。

ubuntu小

sudo mount /dev/sde1 /tools 

確認したNAMEがsde1以外だった場合は、sde1のところを確認したNAMEに差し替えてください。

次に、以下のコマンドでスワップを有効にします。Vivadoの安定動作に必要です。

ubuntu小

sudo swapon /tools/swapfile

これで、USBのマウントが完了しました。

USBから必要なディレクトリをコピーします。

ubuntu小

cp -r /tools/mkubos_swan ~

1.3 Vivado、Vitisの設定ファイルを読み込む

VivadoとVitisの設定ファイルを読み込みます。

ubuntu小

source /tools/Xilinx/Vivado/2022.2/settings64.sh
source /tools/Xilinx/Vitis/2022.2/settings64.sh

vitis &のコマンドで立ち上がるVitisがバージョン2022.2になりました。Vitis起動時の表示を確認してください。

PCの電源を落とすと、マウントが解除になります。もし電源を落とさずにマウントを解除したい時は以下のコマンドを入力してください。

ubuntu小

sudo umount /tools

マウントを解除した後Vitis 2022.1を起動したい場合は、2022.1ディレクトリのsettings64.shを読み込む必要があります。WSL起動時に自動で読み込んでいるので、WSLを再起動すれば2022.1が起動します。

2. ファイルを準備する

作業はUbuntu(WSL2)で行います。Dockerの起動は不要です。

mkubos_swanディレクトリには以下の2つのファイルが入っています。

  • カスタムプラットフォーム用パッケージmkubos-swan-pkg.tar.gz
  • デバイスツリーswan.dtbo

.tar.gzファイルは以下のようにtarコマンドで解凍します。

ubuntu小

tar -zxvf mkubos-swan-pkg.tar.gz

解凍すると、software-componentディレクトリが出てきます。ディレクトリの名前をmkubos_custom_pkgにリネームします。

mkubos_custom_pkgディレクトリに移動して、権限を付与します。

ubuntu小

cd mkubos_custom_pkg
sudo chmod u+x sdk.sh

以下のコマンドを実行して、sysrootディレクトリを生成します。

ubuntu小

./sdk.sh -d .

途中で「続けますか?」と聞いてくるのでyと答えてください。

3. swanのクローン

以下のコマンドでswanをクローンします。

ubuntu小

cd ~/mkubos_swan
git clone https://github.com/turingmotors/swan.git

swanがクローンできなかった時は、USBにswanディレクトリがあるのでコピーして使ってください。

swanディレクトリに移動します。

ubuntu小

cd swan

swanのREADMEにある、以下のコマンドを使用してmodelディレクトリを作ってください。

ubuntu小

mkdir model
wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin -O model/stories15M.bin
wget https://raw.githubusercontent.com/leloykun/llama2.cpp/master/tokenizer.bin -O model/tokenizer.bin

wgetコマンドが正常に動かなかった時は、USBにmodelディレクトリがあるのでダウンロードして使ってください。

4. swan(LLM)をPCで試す。

まずは、自分のPC上でswanが動作するか確認します。
WSLのコマンドラインに、以下のコマンドを1行ずつ入力して、makeファイルを作成後、swanを実行してみてください。

ubuntu小

cd swan
mkdir build && cd build
cmake ..
make
cd ..
./build/swan

swanのソースコードの内容についてはここでは触れません。
言語モデルを高位合成でFPGAに実装してみた
最初にも示したこのサイトに詳細が書かれているので読んでみてください。

5. Vitis起動

vitis &でVitisを起動します。

ubuntu小

vitis &

6. カスタムプラットフォームを作る

カスタムプラットフォームを作ります。 ワークスペース ディレクトリとして[Browse...]ボタンをクリックしてmkubos_custom_pkgディレクトリを選択します。
[Launch]ボタンをクリックします。

新しいプラットフォーム プロジェクトを作成します。
[Create platform project]または[File] → [New] → [Platform Project] をクリックし、プラットフォーム プロジェクトを作成します。
Image
[Platform project name:]にプロジェクト名を入力します。この例の場合、「mkubos_custom」と入力します。[Next] をクリックします。
[Platform] ページで次を実行します。
[XSA File:]の[Browse] ボタンをクリックし、mkubos_cutom_pkgディレクトリにあるsystem_wrapper.xsa を選択します。
[Operating system:]を [linux] に設定します。
[Processor:]を [psu_cortexa53] に設定します。
[Architecture:]を [64-bit] に設定します。
[Generate boot components]: オフ。ここでは、PetaLinux で生成されたブートコンポーネントを使用します。
[Finish] をクリックします。

[mkubos_custom]タブの左側の[linux on psu_cortexa53]をクリックします。

[mkubos_custom]タブの右側の次の3つの項目で、以下のようにファイルおよびディレクトリを選択します。

  • [Bif file]の[Browse]ボタンの横の下向きの黒い三角アイコンをクリックして、[Generate BIF] を選択します。
    Image
  • [Boot Components Directory]の[Browse]ボタンを押して、mkubos_custom_pkg/pfm/bootを選択し、[Open] をクリックします。
    Image
  • [FAT32 Partition Directory]の[Browse]ボタンを押して、mkubos_custom_pkg/pfm/sd_dirを選択し、[Open] をクリックします。
    Image

[Explorer]タブで [mkubos_custom]と書いてあるところを触り、[Build] ボタン(金槌アイコン)imageをクリックしてプラットフォームを生成します。
下の方にある[Console]に「Build Finished」と表示されたら成功です。
このVitisは閉じても大丈夫です。

7. swanアプリケーションプロジェクトを作る

いよいよFPGAのプロジェクトを作成します。
コンソールを開きます。
mkubos_swanディレクトリにアプリケーションプロジェクト用のディレクトリを作ります。同じ名前ですが、mkubos_swanがいいのではないかと思います。他の名前でもいいです。

ubuntu小

cd ..
mkdir mkubos_swan 
cd mkubos_swan

mkubos_swanディレクトリで、Vitisを起動します。

ubuntu小

vitis -workspace .

Vitisが起動したら、まずAdd Custom Platformを選択します。
Image
+ボタンを押して、mkubos_custom_pkg/mkubos_customディレクトリに移動して、Openを押します。OKを押して閉じます。

Create Application Projectを選択します。
Image
先程追加したプラットフォームのmkubos_customを選択してNextをクリックします。
image
[Application Project Name]に「swan」と打ちます。この時、[System project name]は自動的に[swan_system]になります。確認できたらNextを押します。
Sysroot Pathの[Brouse...]ボタンを押して、配布したディレクトリにあるmkubos_custom_pkg/sysroots/cortexa72-cortexa53-xilinx-linuxを選択してください。Root FS、Kernel Imageは空欄で大丈夫です。入力できたらNextを押します。
Empty Applicationを選択してFinishを押します。

8. ビットストリームをビルドする

左上の[Explorer]から[swan_kernels/src]を右クリックし、[Import Sources]を選択します。すると選択ウィンドウが開くので、[Browse…]で~/mkubos_swan/swan/srcディレクトリを選択し[Open]をクリックします。ソースファイルが表示されるので、kernel_*.cppと名前の付くファイルのチェックボックスを選択して、[Finish]をクリックします。
image
すると[swan_kernels/src]にファイルを追加されます。左上の[Explorer]から[swan_kernels/swan_kernels.prj]をダブルクリックして表示される[swan_kernels]タブの丸いアイコンの[Add Hardware Functions]を押します。
Image
kernel_*と名の付く関数を選択して、[OK]をクリックします。
image
image
カーネル関数を指定出来たら、左上の[Explorer]の[swan_system_hw_link/swan_system_hw_link.prj]をダブルクリックします。[swan_system_hw_link]タブが開くので、右上の[Active build configuration]を[Hardware]に変更して、[Build] ボタン(金槌アイコン)imageをクリックしてビットストリームのビルドを開始します。これには数十分掛かります。
ビルドが完了すると、[Console]に「Build Finished」と表示されて、[swan_system_hw_link/Hardware]以下にbinary_container_1.xclbinが生成されています。これがビットストリームです。
もし、「Build Finished」と表示されず、左上の[Explorer]の[swan_system_hw_link]ディレクトリに×が出ている時は、[swan_system_hw_link]ディレクトリを右クリックして、[Clean Project]を選択して、途中ファイルを削除してください。その後、再度[Build] ボタン(金槌アイコン)imageをクリックしてみてください。

9. ホストプログラムをビルドする

左上の[Explorer]で、[swan/src]を右クリックし、[Import Sources]を選択します。[Brouse...]をクリックして~/mkubos_swan/swan/srcディレクトリを選択し[Open]をクリックします。ソースファイルが表示されるので、今度はkernel_*以外のファイルのチェックボックスを選択して、[Finish]をクリックします。
image
左上の[Explorer]の[swan/swan.prj]をダブルクリックした後、[Build] ボタン(金槌アイコン)imageをクリックしてホストプログラムをビルドします。
ビルドが完了すると、[Console]に「Build Finished」と表示されて、[swan/Hardware]以下に実行ファイルswanが生成されます。

10. MKUBOSに各種ファイルを転送する

MKUBOSとPCを接続します。シリアルとイーサネットのポートがあるので授業用のPCと接続してください。
以下の写真を参考にしてください。
Image

MKUBOSの基板には、既にSDカードイメージが書き込まれているSDカードが入っているので、電源を入れるとそのカードからブートします。
電源のスイッチを入れると基板のLEDが点灯してFPGAのファンが回ります。

scpコマンドを用いて、MKUBOSに以下のファイルを転送します。

  • ~/mkubos_swan/mkubos_swan/swan/Hardware/swan
  • ~/mkubos_swan/mkubos_swan/swan_system_hw_link/Hardware/binary_container_1.xclbinをbinary_container_1.binにリネームしたもの
  • ~/mkubos_swan/swan.dtbo (USBにあったファイル)
  • ~/mkubos_swan/swan/modelディレクトリ

MobaXtermを起動して、まずシリアルでログインします。
ログインID:petalinux パスワード:petalinux

以下のコマンドをMKUBOSのシリアルコンソールに入力して、IPアドレスを指定します。

serial小

sudo ifconfig eth0 192.168.1.101 netmask 255.255.255.0 up

これで、イーサネットでPCとMKUBOSを接続できます。
転送には以下のコマンドを使ってください。ファイルのパスが異なる場合は適宜変更してください。

ubuntu小

scp swan/Hardware/swan [email protected]:~
scp swan_system_hw_link/Hardware/binary_container_1.xclbin [email protected]:~/binary_container_1.bin
scp ../swan.dtbo [email protected]:~
scp -r ../swan/model [email protected]:~

9. MKUBOSにswanハードウェアを生成する

以下のコマンドを使ってハードウェアを生成します。

serial小

sudo fpgautil -b binary_container_1.bin -o swan.dtbo

image

10. swan on FPGAを実行する

以下のコマンドでswanを実行します。

serial小

./swan

image

実行すると、動作が遅いことが分かると思います。速度の改善を目指してみてください。
次のページに解析方法や改善案を載せているので、見てみてください。
次のページ(swan改善案)