GPT-4超えの日本語性能？ 話題のELYZA製LLMをBedrockにインポート！ サーバーレス化してみよう

# Llama 3ベースの日本語LLMが登場！

なんと、日本語LLMで有名なELYZA（イライザ）社が、Llama 3ベースの新モデルを発表しました！

https://note.com/elyza/n/n360b6084fdbd

パラメーターサイズが2種類あり、70B版は同社のデモアプリ経由で使用可能。日本語性能ではGPT-4超えとの触れ込みです。

https://elyza.ai/lp/elyza-llm-for-jp

一方、軽量な8B版はHugging Faceで公開されています。こちらはGPT-3.5 Turbo相当の性能とのこと。

https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B

今回は後者の8B版をクローンして、AWSでサーバーレス化してみます。


# AWSのBedrockにインポートしてみる

クラウドサービスAWSの「Amazon Bedrock」には、任意のモデルをインポートして使える「カスタムモデルインポート」という新機能があります。（プレビュー中）

https://aws.amazon.com/jp/bedrock/custom-model-import/

これを利用すれば、ELYZAのモデルをなんとサーバーレスなAPIとして利用することができます。早速試してみましょう。

実施手順は鯨田さん @ren8k の記事を参考にします。

https://qiita.com/ren8k/items/97022fa42dde9c8e8fd8

※エラーで試行錯誤するなかで、鯨田さんご本人にもアドバイスをいただき無事に記事を書けました。神です。ありがとうございます！！🙇‍♂️🙇‍♂️


### クォータ緩和申請

事前に `Imported models per account` クォータを1以上に緩和申請する必要があります。申請後、サポートとやり取りが必要なためご注意ください。

![スクリーン ショット 2024-06-27 に 00.44.51 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/d1df06d8-3a60-1b0a-aad3-8b3237b92717.png)

※リソースが限られているようで、どういう理由でこの機能を使いたいのか？を共有する必要があります。（1週間ぐらいで承認してもらえました）


### モデルファイルのアップロード

事前にモデルをアップロードする用のS3バケットを作成します。

![スクリーン ショット 2024-06-27 に 00.29.54 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/624fb226-ab10-4928-a67b-7e997bfe6964.png)

手元のPCで以下を実行します。（私はM2 MacBook Airを使いました）

```zsh
# Git Large File Storageをインストール
brew install git-lfs
git lfs install

# リポジトリをクローン
git clone https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B

# S3にモデルファイルをアップロード
aws s3 cp --recursive Llama-3-ELYZA-JP-8B/ s3://バケット名/Llama-3-ELYZA-JP-8B
```

### Bedrockにインポート

「Imported models」より、 `Import model` ボタンをクリックします。

![スクリーン ショット 2024-06-27 に 00.47.27 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/3a3242cf-a9dc-fc83-ad49-6f1686d32d1c.png)

前述のS3バケットを指定して、インポートジョブを開始します。

![スクリーン ショット 2024-06-27 に 00.49.03 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/eaee2a6a-6f38-6b5e-ef3e-05307e208b83.png)

20分待つと成功しました✌️

![スクリーン ショット 2024-07-01 に 21.42.13 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/22522939-402e-be50-2369-aba3e90bc574.png)

うおォン[^1] これで俺もBedrockのAPIだ！

[^1]: https://dic.pixiv.net/a/%E3%81%86%E3%81%8A%E3%82%A9%E3%83%B3

# 実際にBedrockで使ってみる

インポートが無事に成功すればこちらの勝利です。ClaudeなどBedrockの他のモデルと同じように扱えます。

Bedrockの1モデルとして、オープンなELYZAを **サーバーレス＆従量課金** で利用することができます！

:::note info
2024/7/1時点では、Bedrockのカスタムモデルインポート機能はプレビュー版です。料金などの詳細な情報が未開示のためご留意ください。
:::


### GUIからの利用（プレイグラウンド）

AWSマネコンの「テキスト」プレイグラウンドから簡単に試せます。

![スクリーン ショット 2024-07-01 に 22.11.50 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/f0cd7359-6fa4-dc50-e079-5ae8e53f09af.png)



### APIからの利用（Python SDK）

サンプルコードは以下です。（Llamaシリーズ用のフォーマットに少し手を加えてみました）
ローカルPCや、Cloud9等の端末から実行してみましょう。

```py:bedrock-elyza.py
import boto3
import json

bedrock_runtime = boto3.client(service_name="bedrock-runtime", region_name="us-east-1")

response = bedrock_runtime.invoke_model(
    body=json.dumps(
        {
            "prompt": "Human: 日本の総理大臣を新しい順に3名教えて？ Assistant:",
            "top_p": 0.9,
            "temperature": 0.2,
        }
    ),
    modelId="arn:aws:bedrock:us-east-1:123456789012:imported-model/abcd12345678", #ここにインポートモデルのARNが入ります。
    accept="application/json",
    contentType="application/json",
)
output = response.get("body").read().decode("utf-8")
response_body = json.loads(output)
print(response_body["outputs"][0]["text"])
```

出力例

```
❯ python3 bedrock-elyza.py
 日本の総理大臣を新しい順に3名教えます。

1. 岸田文雄（2021年10月26日 - ）
2. 菅義偉（2020年9月16日 - 2021年10月26日）
3. 安倍晋三（2012年12月26日 - 2020年9月16日）
```

### 簡単なアプリを作ってみる

StreamlitというPython用のフレームワークを使って、簡単なWebチャットアプリを作ってみましょう。

```py:elyza-ui.py
import boto3
import json
import streamlit as st

st.title("おしえて！ELYZA")
question = st.text_input("質問を入力")
button = st.button("質問する")

bedrock_runtime = boto3.client(service_name="bedrock-runtime", region_name="us-east-1")

response = bedrock_runtime.invoke_model(
    body=json.dumps(
        {
            "prompt": "Human: " + question + "Assistant:  Assistant:",
            "top_p": 0.9,
            "temperature": 0.2,
        }
    ),
    modelId="arn:aws:bedrock:us-east-1:123456789012:imported-model/abcd12345678", #ここにインポートモデルのARNが入ります。
    accept="application/json",
    contentType="application/json",
)
output = response.get("body").read().decode("utf-8")
response_body = json.loads(output)

if button:
    st.write(response_body["outputs"][0]["text"])
```

以下コマンドで起動できます。

```zsh
streamlit run elyza-ui.py
```

こんなに簡単なコードで、リッチなUIが作れるので驚きです。

![スクリーン ショット 2024-07-01 に 22.57.26 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/8f3fcebe-d8a5-1271-6de7-1adb24633ac4.png)

BedrockにAPIを生やせたので、自分のアプリケーションから簡単にELYZAを呼ぶことができますね！


# おまけ

先週、Amazon Bedrockの入門書を出版しました！ おかげさまでめちゃ売れてます🥰

https://www.sbcr.jp/product/4815626440/