RHEL AIをAWS上で構築し、ワークフローを学ぶ

## 目的
RHEL AIをAWSのEC2インスタンスにインストールし、LLMを使用するためのワークフローを学ぶ。
## 1. AWSのEC2上にインストール
https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_ai/1.3/html/installing/installing_on_aws

上記に従ってやればできるが、つまづいた所を記載しておく。

#### RAW Imageのダウンロードとアップロードに時間がかかる

ダウンロードは半日ほど時間がかかったが、端末を放置しておけば良かったので手間は少なかった。
アップロードは、Management Consoleからやると端末を放置したままではエラーとなった。AWS CLIで実行したら、半日ほどで完了した。

#### インストールするInstance Typeに注意！！

公式ページにHardware requirementがあるので、それを参考にすること。私はそれを知らずにt3.medium, g4dn.xlarge, g4dn.2xlarge にインストールしたが、スペック不足で ilab model serve commandが失敗し、それ以上先へ進めなかった。

https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_ai/1.3/html/getting_started/hardware_requirements_rhelai#amazon-web-services-aws-2

私は個人のアカウントでやっており潤沢なリソースを使えないので、最低限のg6.2xlargeを選択した。1時間動かすと、On-Demandで1USD弱かかる。

Spot instanceの方が安いので、それをやってみようと思った。
Spot Instanceで作るにはIDをリクエストする必要がある。Requestしようとしたが、自分のAMIを使えないようで、より調査が必要。
Instance Typeも自由に選べそうでないため、今回は諦める。

#### SSHで接続

AWS CLIでEC2へ接続する。Security GroupのInbound　RulesにTCP 22ポートを追加しておくこと。
EC2のManagement ConsoleからKeypairを作成し、以下のコマンドを実行すること。

~~~
chmod 400 mykey.pem
~~~

Your key file must not be publicly viewable for SSH to work. Use this command if needed: chmod 400 mykey.pem

ユーザは管理者権限のあるec2-userを指定した。

ilabコマンドを実行するには、あらかじめRed Hat Insightsに登録しておく必要がある。ダッシュボードにアクセスして、Activation Keyを作成後に以下のコマンドを実行する。

~~~
sudo rhc connect --activation-key rhel-ai-insights-activation-key --organization 1xxxxxxx
~~~

この後、ilabコマンドが実行できれば準備完了。

## 2. InitializeからChatまで

https://developers.redhat.com/learning/learn:rhel-ai-try-llms-easy-way/resource/resources:understanding-llm-workflows

上記のTutorialを参考に、以下の４つのプロセスを実行した。

<dl>
  <dt>Trying out a LLM</dt>
      <dd>1. Initialize environment</dd>
      <dd>2. download model</dd>
      <dd>3. serve model</dd>
      <dd>4. interact with the model</dd>
</dl>

実行した際に気づいた点、注意点等をにまとめておく。

#### Initialize Environment

~~~
ilab config init
~~~

を実行し、GPUモデルを指定する。g6シリーズはNVIDIA L4を使用しており、2xlargeは8個のvCPUを積んでいるので、　NVIDIA L4 X8　を選択した。

~~~
Next, please select the specific hardware configuration that most closely matches your system.
[0] NO SYSTEM PROFILE
[1] NVIDIA A100 X2
[2] NVIDIA A100 X4
[3] NVIDIA A100 X8
[4] NVIDIA H100 X2
[5] NVIDIA H100 X4
[6] NVIDIA H100 X8
[7] NVIDIA L4 X8
[8] NVIDIA L40S X4
[9] NVIDIA L40S X8
~~~

~~~
nvidia-smi -q
~~~

を実行すると、GPUの詳細を見ることができる。

#### Download model

~~~
skopeo login registry.redhat.io
~~~

上記コマンドを実行し、UsernameとPasswordを入力することでRed HatのRegistoryからRHEL AIでサポートされているモデルをダウンロードできる。

https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_ai/1.3/html/building_your_rhel_ai_environment/downloading_ad_models

今回は　granite-7b-starter　と、　granite-8b-starter-v1　の２つをダウンロードした。EC2のRegionをTokyoでなくNorth Virginiaにしたら、ダウンロードが圧倒的に早かった。

~~~
ilab model list
~~~

を実行するとOS内にインストールされているモデルのリストが出る。

### Serve model

~~~
ilab config edit
~~~

を使い、**gpus=1, nmu_cpus=8**に変更しておくこと！！g6.2xlargeにはGPUが１つしかなく、vCPUが8であるため。これをやらないと ilab model serve を実行してもエラーが出て　ApplictionがReadyにならない。
granite-7b-starter は起動できたが、　granite-8b-starter-v1　は起動できず。他にも設定変更が必要かもしれない。

~~~
INFO:     Started server process [34]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO 04-13 05:59:54 metrics.py:351] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 0.0 tokens/s, Running: 0 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 0.0%, CPU KV cache usage: 0.0%.
~~~

Application startup complete　が出力できれば準備完了。

#### Interact with the model

~~~
ilab model chat --model ~/.cache/instructlab/models/granite-7b-starter
~~~

ilab model serve を実行したTerminalとは別のTerminalを起動し、上記コマンドを入れればLLMとチャットできる。日本語で質問してもまともな答えが返ってこなかった。

## 3. Modelをトレーニングする

以下のプロセスを順番に実行し、Modelをトレーニングしてみる。

<dl>
  <dt>Train a LLM for accuracy</dt>
      <dd>1. Prepare new knowledge</dd>
      <dd>2. Generate synthetic data</dd>
      <dd>3. Train the model</dd>
</dl>

#### 1. Prepare new knowledge

InstructLabで提供されるSynthetic Data Generation (SDG) プロセスを利用してモデルをトレーニングするには、新しいKnowledge（知識）を生成する。

以下のサンプルを使用してqna.yamlファイルを作成した。

https://github.com/instructlab/taxonomy?tab=readme-ov-file#knowledge-yaml-examples

~~~
cd  ~/.local/share/instructlab
mkdir -p ./taxonomy/knowledge/science/astronomy/constellations/Phoenix
cd ./taxonomy/knowledge/science/astronomy/constellations/Phoenix
vi qna.yaml
vi attribution.txt
~~~

RHEL AI上にあるサンプルの知識は不要なので削除しておく。

~~~
rm ~/.local/share/instructlab/taxonomy/compositional_skills/grounded/linguistics/inclusion/qna.yaml
rm ~/.local/share/instructlab/taxonomy/compositional_skills/grounded/linguistics/writing/rewriting/qna.yaml
rm ~/.local/share/instructlab/taxonomy/compositional_skills/linguistics/synonyms/qna.yaml
rm ~/.local/share/instructlab/taxonomy/knowledge/arts/music/fandom/swifties/qna.yaml
rm ~/.local/share/instructlab/taxonomy/knowledge/science/animals/birds/black_capped_chickadee/qna.yaml
~~~

作成したファイルをValidateする。以下のようなメッセージが出ると、Validationが成功していることが分かる。

~~~
ilab taxonomy diff
knowledge/science/astronomy/constellations/Phoenix/qna.yaml
Taxonomy in /var/home/ec2-user/.local/share/instructlab/taxonomy is valid :)
~~~

#### 2. Generate synthetic data

作成したファイルを使ってモデルをトレーニングする。以下のサイトを参考にトレーニングを試みたが、HWスペックが足りずに失敗した。

https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_ai/1.3/html/generating_a_custom_llm_using_rhel_ai/generate_sdg#generate_sdg

generate 前に　ilab config edit で設定変更する必要がある。

~~~
ilab config edit
cat ~/.config/instructlab/config.yaml
~~~

誰がTeacherモデルになりますか？
私の使っているHWでは7bのモデルしか動かないのでmerliniteを指定したが、エラーとなってデータを生成できなかった。。
この時点でのilabのデフォルトのTeacherは　mixtral-8x7b-instruct-v0-1　だった。

~~~
 # Generate configuration section.
 # Teacher model that will be used to synthetically generate training data.
 model: /var/home/ec2-user/.cache/instructlab/models/merlinite-7b-lab-Q4_K_M.gguf
~~~

Student（Trainされる人）とJudgeする人は誰ですか？
Studentにはgranite-7b-starter、Judgeにはmistral-7b-instruct-v0.2.Q4_K_M.ggufを指定したが、エラーになった。
この時点でのilabのデフォルトのJudgeは　prometheus-8x7b-v2-0　だった。

~~~
# Train configuration section.
# Directory where the model to be trained is stored.
model_path: /var/home/ec2-user/.cache/instructlab/models/granite-7b-starter
# Judge model path for phased MT-Bench evaluation.
phased_mt_bench_judge: /var/home/ec2-user/.cache/instructlab/models/mistral-7b-instruct-v0.2.Q4_K_M.gguf
~~~

## 参考文献
文中に記載した記事、リンクを貼った記事を以下に記載した。
当サイトに掲載している記事は個人の見解であり、所属する組織の公式見解ではない。

#### Red Hat社の公式サイト

https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_ai/1.3/html/installing/installing_on_aws

https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_ai/1.3/html/getting_started/hardware_requirements_rhelai#amazon-web-services-aws-2

https://developers.redhat.com/learn/rhel-ai-try-llms-easy-way

https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_ai/1.3/html/building_your_rhel_ai_environment/downloading_ad_models

#### InstructLabの公式ドキュメント

https://github.com/instructlab/instructlab/blob/main/README.md

https://github.com/instructlab/taxonomy