4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Lambda SnapStartがPythonに対応したので改めてLangServe on Lambdaをやってみた

Posted at

今まで、Javaのみに提供されていたLambda SnapStartがPythonと.Netに対応しました🎉🎉🎉

さすがクラスメソッドさん、もうブログが出ていますので、「SnapStartって何?」みたいな方はこちらを参照いただければと思います。

以前、Lambda上でLangServeを動作させる方法(こちら)を投稿したのですが、1年ぐらいたつので、改めてやってみました。

LangServeは、LangChainのチェーンをいい感じにWeb APIにするやつです

手順

LangServeのLambdaレイヤーを作成する

CloudShellで作業します。

pythonのSnapStartは、Pythonの3.12以降が対応とのことで、今回は最新のPython3.13を使用します。

CloudShellにインストールされているPythonは3.9なので、Dockerを使いつつ、無理やりPython3.13のレイヤーを作成します。

CloudShell
mkdir python

docker run \
-v $PWD/python:/python \
--user $(id -u):$(id -g) \
python:3.13-bullseye pip install -t python langserve[server]==0.3.0 langchain-aws==0.2.7

rm -r python/boto*

zip -r9 langserve-layer.zip python

aws lambda publish-layer-version \
--layer-name langserve-layer-p313 \
--compatible-runtimes python3.13 \
--compatible-architectures x86_64 \
--zip-file fileb://langserve-layer.zip --no-cli-pager

python:3.13だとLambda環境で実行時エラーになるのでpython:3.13-bullseyeを指定しています。

Lambda関数を作成する

マネジメントコンソールで頑張ります。

ランタイムは「Python 3.13」を選択して、「関数の作成」をクリックします。

ラインタイム設定

ハンドラを「run.sh」に変更します。(run.shは後ほど作成します)

レイヤーを指定する

先ほど作成したLangServeのレイヤーに加え、「AWS Lambda Web Adapter」を追加します。

AWS Lambda Web Adapterは、FastAPIなどのWebアプリをLambda上で動作させるAWS製のライブラリーです。LangServeも内部的にFastAPIを使用しています。

  • LangServeレイヤー(langserve-p313)

    バージョンはそれぞれの環境で変わってくると思います。

  • Lambda Web Adapter

    ARNを直接指定します。(リージョンはLambdaのリージョンに合わせます)

    arn:aws:lambda:us-east-1:753240598075:layer:LambdaAdapterLayerX86:23

ソースコードを記述する

ソースコードを記述します。

lambda_function.pyは不要なので削除します

  • main.py

    main.py
    #!/usr/bin/env python
    
    from fastapi import FastAPI
    from langchain_aws.chat_models import ChatBedrockConverse
    from langchain_core.output_parsers import StrOutputParser
    
    from langserve import add_routes
    
    app = FastAPI(
        title="LangServe",
        version="1.0",
        description="LangChain Server",
    )
    
    chain = ChatBedrockConverse(model="us.anthropic.claude-3-5-haiku-20241022-v1:0") | StrOutputParser()
    
    add_routes(
        app,
        chain,
        path="/bedrock",
    )
    
    if __name__ == "__main__":
        import uvicorn
    
        uvicorn.run(app)
    
    
  • run.sh

    run.sh
    #!/bin/bash
    
    PATH=$PATH:$LAMBDA_TASK_ROOT/bin \
        PYTHONPATH=$PYTHONPATH:/opt/python:$LAMBDA_RUNTIME_DIR \
        exec python -m uvicorn --port=$PORT main:app
    

ソースは自動保存されます。
ソースが完成したら、必ず「Deploy」ボタンを押してください。

諸々設定する

設定を色々します。

  • 一般設定

    • メモリを256MBにします(お好みで)
    • SnapStartを「PublishedVersions」にします
    • タイムアウトを30秒にします(お好みで)

    また、画面下部の「既存のロール」のリンクからIAMロールの画面に遷移し、「BedrockFullAccess」を追加します。

  • 環境変数

    Lambda Web Adapterの動作に必要なので以下の環境変数をセットします。

    • AWS_LAMBDA_EXEC_WRAPPER : /opt/bootstrap
    • AWS_LWA_INVOKE_MODE : response_stream
    • PORT : 8000

バージョンとエイリアス、関数URLを作成する

SnapStartを使用するには「バージョン」を作成する必要があります。
関数URLを使用するには「エイリアス」を作成する必要があります。

ということで、「バージョン」を作ったうえで「エイリアス」を作ります。

まずはバージョンを作成します。

そしてエイリアスを作成します。

最後に関数URLを作成します。

認証タイプを「NONE」にし、その他の設定の中にある「呼び出しモード」を「RESPONSE_STREAM」に設定します。

これで、SnapStartを有効化した関数URLが発行されます。

ブラウザでアクセスしてみる

関数URLのURLの末尾に/docsをつけてブラウザでアクセスします。

OpenAPIのドキュメントが表示されます。

今回は「/bedrock」としてAPIを作成したので、「/bedrock/playground」にアクセスすると、プレイグラウンドが表示されます。

もちろん、呼び出しも可能です。

普通にWeb画面が表示されてますが、これ、Lambdaのレスポンスですよ。すごくないですか??

SnapStartの検証はできてませんすいませんw

4
4
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
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?