5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qwen 3をOllama経由でStrands Agentsで使う!Bedrock AgentCore Runtimeにデプロイできるのか?!

Posted at

小さな大規模言語モデルが色々出て来ているようです。Ollamaを使うと、ツヨツヨGPUがない環境でも比較的簡単に動かすことができます。

最近登場したgpt-ossや、Gemma 3 270Mなども使えます

Ollama使ってみる

公式ダウンロードページにインストーラーが用意されているのでこれをインストールするだけです。

Windowsの場合、Ollamaアプリを起動するとタスクバーに常駐します。(これを終了するとOllamaも終了します)

image.png

アイコンがかわいい。。癒やされる。。

最近、チャット機能も追加され、超簡単に使えます!

image.png

私のパソコンはスペック控えめなので、とてもサイズの小さいQwen 3の0.6Bモデルを使います。めっちゃ小さい!

コマンドでモデルを取得してみます。

PowerShell
ollama pull qwen3:0.6b
pulling manifest
pulling 7f4030143c1c: 100% ▕██████████████████████████████████████████████████████████▏ 522 MB
pulling ae370d884f10: 100% ▕██████████████████████████████████████████████████████████▏ 1.7 KB
pulling d18a5cc71b84: 100% ▕██████████████████████████████████████████████████████████▏  11 KB
pulling cff3f395ef37: 100% ▕██████████████████████████████████████████████████████████▏  120 B
pulling b0830f4ff6a0: 100% ▕██████████████████████████████████████████████████████████▏  490 B
verifying sha256 digest
writing manifest
success

コマンドでチャットができます。

PowerShell
ollama run qwen3:0.6b

image.png

Strands Agentsから使ってみる

Strands AgentsはAWSが開発しOSSで公開しているAIエージェント開発のフレームワークです。イチオシです。

Strands Agentsから、Ollamaでホスティングしたモデルを呼び出してみましょう。

uvを使いますので公式ドキュメントに沿ってインストールしてください。

プロジェクトを作成します。

PowerShell
uv init --python 3.11 --name strands-ollama

Strands Agentsを追加します。

PowerShell
uv add strands-agents[ollama]

[ollama]を指定することで、Ollamaを呼び出す際に必要な追加ライブラリーも一緒に導入できます。

Pythonのコードを作成します。最もシンプルなコードがこちらです。

main.py
from strands import Agent
from strands.models.ollama import OllamaModel

model = OllamaModel(
    host="http://localhost:11434",
    model_id="qwen3:0.6b",
)

agent = Agent(model=model)
agent("こんにちは")

これだけです。すごいですね。

実行してみましょう。

PowerShell
uv run main.py

<think>
Okay, the user said "こんにちは" which is "Hello" in Japanese. I need to respond appropriately. First, I should acknowledge their greeting. Maybe say "Hello!" and then offer assistance. Let me check if there's any specific context I should consider, but since there's no additional info, just a friendly response is best. Make sure the tone is positive and open-ended.
</think>

こんにちは!どうすればいいか?何かお求めですか?😊

今頃気づきましたが、Thinkingモデルなんですね!

Bedrock AgentCore Runtimeへのデプロイに挑戦!

やったらできたよ!ってだけで想定された使い方ではない可能性が高いです

ローカルで動作させることができました!

モデルサイズも小さいので、AWSにデプロイできたりしないかと思いまして、最近発表されたBedrock AgentCoreへのデプロイに挑戦しました!(ブログ作成時点でプレビュー機能です)

AgentCore RuntimeはAgentCoreの機能の一つで、AIエージェントの実行環境をサーバーレスで提供してくれます。ここにOllamaとStrands Agentsで作ったアプリをデプロイします。

Strands AgentsアプリをAgentCore Runtimeに対応させる

ここから先のWSL2上で行った手順になってます

Strands AgentsのアプリをAgentCore Runtimeに対応させるには、まず、bedrock-agentcoreライブラリーをインストールします。

uv add bedrock-agentcore

そして、このような形でStrands Agentsの機能をAPI化します。

from bedrock_agentcore import BedrockAgentCoreApp

from strands import Agent
from strands.models.ollama import OllamaModel

app = BedrockAgentCoreApp()

model = OllamaModel(
    host="http://localhost:11434",
    model_id="qwen3:0.6b",
)

agent = Agent(model=model)


@app.entrypoint
async def agent_invocation(payload):
    """Handler for agent invocation"""
    user_message = payload.get(
        "prompt",
        "No prompt found in input, please guide customer to create a json payload with prompt key",
    )
    stream = agent.stream_async(user_message)
    async for event in stream:
        yield (event["event"])

if __name__ == "__main__":
    app.run()

AgentCore Runtimeへデプロイする前にローカルPC上で動作確認します。

uv run main.py

Webサーバーが起動しますので、別の端末を起動し、cURLでリクエストを送信します。

curl -X POST http://localhost:8080/invocations \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "こんにちは"
  }'

AgentCore Runtimeへデプロイするためにコンテナ化する

AgentCore Runtimeへデプロイするには、Strands Agentsアプリをコンテナ化する必要があります。色々試行錯誤したので、その点を抜粋して紹介します。

ソースコードはGitHubで公開済みですので、細かな点はこちらを参照ください。

https://github.com/moritalous/agentcore-ollama

試行錯誤1)一つのコンテナ内に、2つのWebサーバーを起動させたい

Ollama自体がWebサーバーの形式を取っており、更にAgentCore Runtimeから呼び出されるStrands AgentsもWebサーバーとして起動する形になります。なので、一つのコンテナ内に2つのWebサーバーを起動させる必要があります。

調べると、supervisorを使うと実現できるとのことでした。

supervisorの設定ファイルを作成します。

Dockerfileで以下の手順を記述します

  • supervisorのインストール
  • supervisorの設定ファイルをコピー
  • CMDで起動

(内容と関係ないですが)GitHubのソース埋め込み超便利!

試行錯誤2)モデルを任意の場所に取得する

Qwen 3のモデルをコンテナ内に含めたかったので、まずはモデルのダウンロード先を指定します。モデルのダウンロード先は環境変数``で指定可能です。

# Ollamaが起動していない状態でセット
export OLLAMA_MODELS=`pwd`/.ollama/models

# Ollamaを起動
ollama serve

別の端末でollama pull qwen3:0.6bを行うと、.ollama/modelsディレクトリにモデルがダウンロードされます。

試行錯誤3)AgentCore Runtimeに登録できるコンテナイメージは1GBまで

AgentCore Runtimeに登録できるコンテナイメージのサイズは1GBまでです。

超過するとAgentCore Runtimeの作成時にエラーとなります。

qwen3:0.6bのサイズは513MBと1GBに収まっているのですが、そもそもOllamaをインストールすると1GBを超えてしまいます。(T_T)

(AgentCore Runtimeの動作環境はarm64環境です)

image.png

環境によってはインストーラーのサイズが異なるので、なにかいい手はないかと調べました。

すると、インストールされるファイルの中にCUDA環境用のライブラリーが含まれており、これらがかなりのサイズになっていることがわかりました。これらをバッサリ削除します!(消しても動いたので大丈夫!?)

こちらのビルド手順ドキュメントに、If the libraries are not found, Ollama will not run with any acceleration librariesとあったので、ライブラリーがなくても動作は可能と判断しました。

ちなみにですが、以下のように記述してもコンテナのサイズは減りませんでしたので、インストールとファイル削除を、「一つのRUNコマンド」で行う必要があります。

Dockerfile(サイズが減らないだめな例)
RUN curl -fsSL https://ollama.com/install.sh | sh
RUN rm -rf /usr/local/lib/ollama/cuda_sbsa

AgentCore Runtimeにデプロイできた!

ソースができたら、コンテナイメージをビルドし、ECRにプッシュします。

手順はこんな感じです。

ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
AWS_REGION=us-west-2

AGENT_NAME=agentcore-ollama

docker buildx create --use

aws ecr create-repository --repository-name ${AGENT_NAME} --region ${AWS_REGION}
aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com

docker buildx build --platform linux/arm64 -t ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AGENT_NAME}:latest --push .

ECRへプッシュができたら、マネジメントコンソールでAgentCore Runtimeを作成します。

image.png

メニューの「Agent sandbox」からテスト実行が可能です。

テストが成功したので、最後にStreamlitで画面を作成しました。

動作している様子はこんな感じです。

動作はしますが、時間がかかりますね。。

まとめ

AgentCore RuntimeでGPUが使えるようになって、コンテナサイズの上限が緩和されると夢が広がりますね!

ソースコードはこちらです。

エージェントの動作は、少し色気を出して、こちらのブログで紹介されている「Strands AgentsとTavilyを使って動的ウェブリサーチエージェントを作る」のコードを参考にしました。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?