1.はじめに
こんにちは。
私は情報システムやサービスの運用に関する研究開発を担当する部署に所属している新人エンジニアです。
今回は以前ご紹介したObservabilityツールの中から「OpenLIT」を選択して実際に触ってみました。
環境については、AWSの「EC2」上で構築しました。
また、同じくAWSの生成AIサービスである「Bedrock」も活用してみました!
本記事はIT知識ゼロの私が、生成AIに特化したObservabilityツールであるOpenLITを導入した内容をまとめたものになります。
まずはOpenLITについておさらいした後に、導入方法について説明します。
2.OpenLITって何?
OpenLITは生成AIアプリケーションを監視するためのOSSです。
近年、「生成AI」はビジネスや日常生活のさまざまな場面で利用されており、最も勢いのある技術といっても過言ではありません。
その生成AIを効果的に運用するには、そのパフォーマンスや問題点をリアルタイムで監視し、トラブルが発生した場合に迅速に対応する必要があります。
「OpenLIT」は生成AIに特化して、パフォーマンスと使用状況を追跡・分析できるObservabilityツールです。
以下に主な特徴についてまとめます。
本記事の情報は2024年12月時点、v1.11.6
の情報です。
主な特徴
特徴1:生成AIに特化した監視項目が用意されている
一般的なObservabilityツールとの大きな違いが生成AIに特化しているという点です。
監視項目の一部を以下に示します。
監視項目
- 合計トークン数、平均トークン数
- 合計コスト、平均コスト
- 1リクエストあたりの時間
- 使用モデル割合
- リクエストごとの詳細情報(時刻、プロンプト、リクエスト、トークン、コスト、etc.)
- エラーの発生時の詳細情報(時刻、エラー文、エラータイプ、etc.)
生成AI以外にもベクトルDBとGPUに対してのダッシュボードも用意されています。
特徴2:多くのLLMモデルプロバイダーに対応している
有名なLLMモデルプロバイダーである「OpenAI」や「Anthropic」はもちろん、多くのLLMモデルに対応しています。
いくつものモデルの情報を1つのダッシュボード上で監視することができるので、複数のモデルを使用している方にとてもおすすめです!
25種類のLLMモデルプロバイダーに対応
参考情報:Monitor AI Applications using OpenTelemetry
特徴3:簡単にデプロイできる
わずか数ステップでLLMアプリケーションの監視ができるようになります。
詳細は本記事の3章および4章で説明します。
3. 前提環境の構築
まずはOpenLITを動作させるための環境を構築します。
利用サービス
- 開発環境:Amazon Elastic Compute Cloud(EC2)
- LLMモデルサービス:Amazon Bedrock
AWSマネジメントコンソール上の準備
Amazon Bedrock上でモデルの有効化
Amazon Bedrockのモデルを使用するために、モデルを有効化する必要があります。
過去に有効化を実施した場合、この手順は不要です。
AWSマネジメントコンソールから「Bedrock」を検索して、「Bedrock configurations」の「モデルアクセス」を選択します。
Bedrockでは、リージョンによって使用できるモデル数が大きく異なるためリージョンの選択が重要です。
今回は動作確認程度ですので、東京リージョン(ap-northeast
)を選択します。
さらに多くのモデルを使用したい場合はバージニア北部(us-east1
)もしくはオレゴン(us-west2
)を選択しましょう。
東京リージョンに変更できたら、「モデルアクセスを変更」を選択し、使用したいモデルを有効にしてください。
今回はClaude 3 Haiku
を選択します。
最新版であるClaude 3.5 Sonnet
を選択しない理由は、OpenLITの料金表にまだ反映されていないためです。
OpenLITの料金表については以下を参考にしてください。
参考情報:Using the Default Pricing File
EC2インスタンスの立ち上げ
AWSマネジメントコンソールから「EC2」を検索して、「インスタンスを起動」を選択します。
インスタンスの設定
- 名前とタグ:任意(今回は
qiita-post
) - AMI(OS):Amazon Linux 2023
- インスタンスタイプ:任意(今回は
t3.medium
) - キーペア:任意
- ネットワーク:セキュリティグループを作成(詳細は後述)
- ストレージ:任意(今回は16 GB)
AMIに関して、他の候補でも問題ありませんが、この後のCLI上の操作に影響を与える可能性があります。
インスタンスタイプやストレージに関して、基本任意ですが、スペックが低すぎるとOpenLITが動作しない可能性があります。そのため、今回は「t3.medium
」および「16 GB」としました。
「インスタンスを起動」を選択すると作成完了です!
セキュリティグループの設定
セキュリティグループは初期設定のままだと、すべての外部からのトラフィックを拒否しています。
OpenLITのダッシュボードは、EC2インスタンスのパブリックIPアドレスの3000番ポート上で動作します。そのため、セキュリティグループ設定で3000番ポートへのアクセスを許可する必要があります。
openlit
ディレクトリ内のdocker-coompose.yml
の設定を変更することでデフォルトの3000番ポートから、任意ポート番号に変更することが可能です。今回はデフォルトを使用しています。
EC2の画面に戻り、先ほど作成したインスタンス(qiita-post
)を選択します。
画面下部のセキュリティタブから「セキュリティグループ」を選択して、「インバウンドルールを編集」を選択します。
インバウンドルールの設定
- タイプ:カスタムTCP
- プロトコル:TCP
- ポート範囲:3000
- ソース:マイ IP(他のPCから受け付けたい場合は、範囲を広くする必要があります)
- 説明:任意
ルールを保存を選択して、完了です!
EC2インスタンスにIAMロールをアタッチ
Bedrockの機能をEC2インスタンスで扱えるようにするため、AmazoBedrockFullAccess
のポリシーが入ったIAMロールをアタッチする必要があります。
AWSマネジメントコンソールから「IAM」を検索して、「ロール」を選択、「ロールの作成」を選択します。
IAMロールの設定
- 信頼されたエンティティタイプ:AWSのサービス
- ユースケース:EC2
- 許可ポリシー:
AmazonBedrockFullAccess
- ロールの詳細:任意(今回はロール名を
AmazonBedrockFullAccess
)
「ロールを作成」を選択すると作成完了です!
その後EC2に戻り、先ほど作成したインスタンスを選択します。
「アクション」の「セキュリティ」から「IAMロールを変更」を選択します。
先ほど作成したIAMロール(AmazonBedrockFullAccess
)を選択し、「IAMロールの更新」を選択すると完了です!
これで、EC2インスタンス上でBedrockを自由に扱うことができるようになりました!!
インスタンスの接続方法については、以下のページを参考にしてみてください。
インスタンスに接続できましたら、次はインスタンス上の準備です。
EC2インスタンス上での準備
今回はAmazon Linux 2023
の環境に前提となるツールやライブラリを導入していきます。
導入ツール・ライブラリは次の6つです。
- Docker
- Docker compose
- Python
- pip
- Boto3
- Git
「Docker」と「Docker compose」の導入に関しては、以下の記事を参考にさせていただきました。
パッケージのアップデート
$ sudo dnf update
Dockerのインストール
# dockerインストール
$ sudo dnf install -y docker
# dockerデーモン起動
$ sudo systemctl start docker
# ユーザーグループの追加
$ sudo gpasswd -a $(whoami) docker
# dockerに書き込み権限の付与
$ sudo chgrp docker /var/run/docker.sock
# dockerデーモンの再起動
$ sudo service docker restart
# dockerデーモンの自動起動
$ sudo systemctl enable docker
dockerのバージョンを確認して、正しくバージョンが確認できれば成功です!
$ docker -v
Docker version 25.0.5, build 5dc9bcc
Docker composeのインストール
# docker composeのインストール
$ sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 実行権限の付与
sudo chmod +x /usr/local/bin/docker-compose
docker-composeのバージョンを確認して、正しくバージョンが確認できれば成功です!
$ docker-compose -v
Docker Compose version v2.32.1
Pythonとpipのインストール
$ sudo dnf install python3 python3-pip -y
AWSのライブラリ(Boto3)をインストール
$ pip install boto3
Gitのインストール
$ sudo yum install git -y
これで、OpenLITを導入する準備が全て整いました!!
長かった....。
4.OpenLITの導入
ついにOpenLITの導入に入ります。
以下のGitHubのページを参考に導入します。
導入手順
OpenLITの導入
# openlitをクローン
$ git clone https://github.com/openlit/openlit.git
# openlitのライブラリをインストール
$ pip install openlit
以下のようにエラー文が表示される場合には、distro
を適切なバージョンでインストールしましょう。
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
awscli 2.17.18 requires distro<1.9.0,>=1.5.0, but you have distro 1.9.0 which is incompatible.
# 対処法(distroをインストール)
$ pip install distro==1.8.0
OpenLITの起動
# ディレクトリを移動
$ cd openlit
# dockerコンテナを起動
$ sudo docker-compose up -d
これで、OpenLITの導入が完了し、生成AIを監視する準備がととのいました!
ツールの特徴にも示した通り、OpenLIT自体の準備はとても簡単でしたね!!
次は、生成AIを用いて自作したアプリケーションコードの情報をOpenLITに送ってみます。
5.OpenLITに接続
OpenLITにデータを送信するには以下のコードをPythonで書いた自作のアプリケーションコードに追記するだけです。
import openlit
openlit.init(otlp_endpoint="http://[EC2インスタンスのパブリックIPv4アドレス]:4318")
例えば、以下のようにBedrockのモデル(claude-3-haiku
)を用いたアプリケーションコードにOpenLITのコードを書き加えてみます。
# Python外部ライブラリをインポート
import boto3
import openlit
# OpenLITにデータを送信
openlit.init(otlp_endpoint="http://[EC2インスタンスのパブリックIPv4アドレス]:4318")
# Bedrock Runtimeクライアントを作成
bedrock_runtime = boto3.client(
service_name = 'bedrock-runtime',
region_name = 'ap-northeast-1'
)
# 使用するモデルIDを設定
modelId = "anthropic.claude-3-haiku-20240307-v1:0"
# プロンプトを決定
prompt = "1日何時間睡眠をとるべきですか?"
# メッセージ作成
messages = [
{
"role": "user",
"content": [{"text": prompt}],
}
]
# 推論設定を構成
inferenceConfig = {
"temperature": 0.1,
"topP": 0.9,
"maxTokens": 500,
"stopSequences":[]
}
# Bedrock Runtimeで会話を実行
response = bedrock_runtime.converse(
modelId=modelId ,
messages=messages,
inferenceConfig=inferenceConfig
)
# 応答結果を表示
print(response["output"]["message"]["content"][0]["text"])
エンドポイントにはご自身のEC2インスタンスのパブリックIPv4アドレスを設定してください。
実行すると、以下のように応答結果が出力されました。
一般的に、成人の適切な睡眠時間は以下のように言われています:
- 7~9時間が推奨されます。
- 6時間未満や10時間を超えるのは望ましくありません。
- 個人差がありますので、自分に合った睡眠時間を見つけることが大切です。
睡眠時間は年齢によっても異なります:
- 乳幼児: 12~17時間
- 学童期: 9~11時間
- 思春期: 8~10時間
- 高齢者: 7~8時間
睡眠の質も重要で、熟睡できることが大切です。
睡眠不足や睡眠の質が悪いと、集中力の低下や健康面での影響が出る可能性があります。
自分に合った適切な睡眠時間を見つけることをおすすめします。
(みなさんちゃんと8時間寝ていますか...?)
ここで、OpenLITにデータが送信されたか確認してみましょう!
http://[インスタンスのパブリック IPv4 アドレス]:3000
を確認すると、ログイン画面が表示されます。
EmailとPasswordを入力してログインします。
今回は初回なのでデフォルトの認証情報を使用しました。
- Email:
user@openlit.io
- Password:
openlituser
実際に運用する場合には、デフォルトを使い続けるのではなく、新しくユーザーを追加しましょう。
すると、ダッシュボードが表示され、先ほどBedrockを使用したときのデータが送信されていることが確認できます!!
コストやトークン数、使用したLLMのプロバイダーなどの情報がダッシュボード上で確認できていますね。
次に、Requestsページを確認してみます。
ここでは、各プロンプトとそれに対応するレスポンス内容、実行時刻、使用コストなどを確認することができます。
このように、OpneLITを用いてあなたの使用している生成AIがちゃんと働いているか確認できるようになりました!!
6.苦労したところ
今回、OpenLITはもちろんのこと、AWSのサービスも初めて触りましたので、本当に多くの部分でつまずきました...。
(正直途中で諦めそうになりました。)
その中でも、特にみなさんにも関係のありそうな部分について紹介していきます。
OpenLITがinvoke_model
関数への対応を終了していた
Bedrockのモデルを使用するにあたり、『Amazon Bedrock 生成AIアプリ開発入門』を参考にして進めていました。
アプリケーションコードについて、初めはBedrockのinvoke_model
関数を用いてモデルを呼び出し、作成していました。
# レスポンスを定義
response = bedrock.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)
response_body = json.loads(response.get("body").read())
answer = response_body["content"][0]["text"]
そのソースファイルを実行すると、特にエラーもなく出力結果を受け取れるのですが、何度見てもOpenLITのダッシュボードには反映されていません。
そこで、「Wireshark」というツールを用いてパケットキャプチャを試みたところ、OpenLITへデータの送信が行われていないことがわかりました。
色々と探ってみると、どうやらinvoke_model
を使用していたことが問題のようでした。
OpenLITの2024年8月1日のマージ内容を確認してみると、invoke_model
への対応が終了しており、代わりに新しいモデルアクセス関数であるconverse
を使用してくださいとのことでした...。
This PR fixes the issue found in #297 and also removes wrapping of invoke_model function in the Bedrock Instrumentation. Instead, The converse function will be wrapped.
生成AI関連のツールや技術は、日々目まぐるしく進化して更新されてることがよくわかりました。そのため、最新情報を常にチェックし続けることが重要ですね!
『Amazon Bedrock 生成AIアプリ開発入門』のGitHubリポジトリには、converse
の実装後に更新されたソースコードが掲載されています。
参考情報:bedrock-bookのGitHubリポジトリ
Database Configに誤りがあった
アプリケーションコードを実行した後にOpenLITのダッシュボードを開いたところ、データの受信に失敗しており、以下のようなエラー文が画面右下に表示されていました。
これはDBのユーザー名が誤っていることが原因でした。
openlitディレクトリ内のdocker-compose.yml
を確認すると、デフォルトのユーザー名とパスワードが記載されています。
services:
clickhouse:
image: clickhouse/clickhouse-server:24.2.2
container_name: clickhouse
environment:
CLICKHOUSE_PASSWORD: ${OPENLIT_DB_PASSWORD:-OPENLIT}
CLICKHOUSE_USER: ${OPENLIT_DB_USER:-default}
volumes:
- clickhouse-data:/var/lib/clickhouse
ports:
- "9000:9000"
- "8123:8123"
restart: always
openlit:
image: ghcr.io/openlit/openlit:latest
container_name: openlit
environment:
INIT_DB_HOST: clickhouse
INIT_DB_PORT: 8123
INIT_DB_DATABASE: ${OPENLIT_DB_NAME:-openlit}
INIT_DB_USERNAME: ${OPENLIT_DB_USER:-default}
INIT_DB_PASSWORD: ${OPENLIT_DB_PASSWORD:-OPENLIT}
SQLITE_DATABASE_URL: file:/app/client/data/data.db
ports:
- "80:3000"
depends_on:
- clickhouse
volumes:
- openlit-data:/app/client/data
restart: always
その情報をOpenLITのDBページに設定しなおすことで、問題なくLLMデータの受信ができるようになりました。
通常はデフォルトで正しいユーザー名が入力されているはずですが、私の場合はなぜか誤っていました。
7.おわりに
今回はIT初学者が生成AIに特化したObservabilityツールであるOpenLITを導入し、その概要についてまとめました。
OpenLITの導入自体はとても簡単なコードなので、「なんだ簡単じゃん~」とか思っていましたが、思わぬところでとてつもなく苦労しました...。
ですが、みなさんこういう経験を経てエンジニアとして成長しておられると思いますので、私も1つくらいは階段を登れたのかなと信じています笑
OpenLITは今回紹介したもの以外にも多くの機能を有しておりますので、みなさんもぜひ触ってみてください!
私も本記事とは別でOpenLITの具体的な機能に関する記事を投稿したいと考えています。
生成AIを用いたアプリケーションを作成して運用している方や、Observabilityについてこれから触っていこうと考えている方の参考になれば幸いです。
今後は、OpenLITの具体的な機能の調査やその他のObservabilityツールの紹介を投稿する予定です。
最後までお読みいただき、ありがとうございました。