ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Azure App Service の Sidecar に Phi-3 をデプロイして Web アプリケーションの機能を拡張する

Azure App Service on Linux に Sidecar パターン機能(Public Preview)が追加されていますが、Phi-3 を Sidecar にデプロイするユースケースの記事が公開されていました。
azure.github.io

Sidecar パターンの特性に適していて、生成 AI を活用した Web アプリケーションのアーキテクチャとして非常に面白そうだと感じました。
このアーキテクチャへの期待感と可能性を記事を書くことにしました。(上記のブログとほぼ同じ内容なので、技術的な掘り下げは行っていません)

App Service の Sidecar パターンについては、前回の記事を参照してください。
gooner.hateblo.jp

Sidecar アプリケーションを作成する

Phi-3 は、Microsoft によって開発された Small Language Models(SLM)です。Phi-3 モデルの呼び出しをサポートするツールには Ollama を使い、Web アプリケーションから REST API で対話できるインターフェイスをもったコンテナーを作成します。

Ollama は、ローカル環境で LLM や SLM のモデルを動かすことができるツールです。Phi-3 以外にも、Llama 3.1 や Google Gemma 2 などのモデルをサポートしています。
ollama.com

今回は Ollama の Docker Image をベースに Dockerfile を作成します。

FROM ollama/ollama
 
EXPOSE 11434
 
COPY startup.sh /
 
RUN chmod +x /startup.sh
 
ENTRYPOINT ["./startup.sh"]

startup.sh では、Ollama で利用するモデルに Phi-3 を指定しています。

#!/usr/bin/env bash
 
# Start Ollama in the background
ollama serve &
sleep 5
 
# Pull and run phi3
ollama pull phi3
 
# Restart ollama and run it in to foreground.
pkill -f "ollama"
ollama serve

この Docker イメージをDocker Hub にプッシュしておきます。

$ docker build -t thara0402/sidecar-slm:0.1.0 ./
$ docker push thara0402/sidecar-slm:0.1.0

Sidecar を呼び出す側のアプリケーションを作成する

ASP.NET Core で Sidecar を呼び出すシンプルな Web API を作成します。

[Route("api/[controller]")]
[Produces("application/json")]
[ApiController]
public class GenerateController : ControllerBase
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly IConfiguration _configuration;

public GenerateController(IHttpClientFactory httpClientFactory, IConfiguration configuration)
{
    _httpClientFactory = httpClientFactory;
    _configuration = configuration;
}

[HttpPost]
public async Task<ActionResult<string>> Post([FromBody] string prompt)
{
    var sidecarUrl = _configuration["SIDECAR_SLM_URL"];
    var json = @"
    {
        ""model"": ""phi3"",
        ""prompt"": """ + prompt + @""",
        ""stream"": false,
        ""options"": {
            ""num_keep"": 5,
            ""num_predict"": 150,
            ""seed"": 42,
            ""top_k"": 1,
            ""top_p"": 0.9,
            ""tfs_z"": 0.5,
            ""typical_p"": 0.7,
            ""repeat_last_n"": 33,
            ""temperature"": 0.8,
            ""repeat_penalty"": 1.2,
            ""presence_penalty"": 1.5,
            ""frequency_penalty"": 1.0,
            ""mirostat"": 1,
            ""mirostat_tau"": 0.8,
            ""mirostat_eta"": 0.6,
            ""penalize_newline"": true,
            ""stop"": [""<*end*>""],
            ""num_thread"": 8
        }
    }";

    var httpClient = _httpClientFactory.CreateClient();
    var content = new StringContent(json, Encoding.UTF8, "application/json");
    var response = await httpClient.PostAsync(sidecarUrl, content);

    if (response.IsSuccessStatusCode)
    {
        var responseContent = await response.Content.ReadAsStringAsync();
        return Ok(responseContent);
    }
    else
    {
        return StatusCode((int)response.StatusCode, response.ReasonPhrase);
    }
}

Sidecar の URL については、appsettings.json に切り出しておきました。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "SIDECAR_SLM_URL": "http://localhost:11434/api/generate"
}

上記以外のコードや Dockerfile はテンプレート通りなので説明は割愛します。
アプリケーションが完成したので、Docker Hub にプッシュしておきます。

$ docker build -t thara0402/sidecar-primary-app:0.6.0 ./
$ docker push thara0402/sidecar-primary-app:0.6.0

なお、Generate API 以外にも Ollama でモデルを実行および管理するための REST API エンドポイントが提供されています。
github.com

Sidecar を構成した App Service をデプロイする

App Service on Linux に Sidecar パターンを構成していきます。リージョンは West Europe を指定しました。

App Service を作成後、 Deployment Center から Sidecar のコンテナーを追加します。


動作確認

VS Code 拡張機能の REST Client からデプロイした Web API を呼び出してみます。

@primary_app_HostAddress = https://<your-app-service-name>.azurewebsites.net

POST {{primary_app_HostAddress}}/api/generate/ HTTP/1.1
content-type: application/json

"What is Azure App Service?"

###

次のようなレスポンスが返却されており、期待される結果であることが分かります。

{
    "model": "phi3",
    "created_at": "2024-08-14T07:48:51.268204818Z",
    "response": "Azure Application Services (AppService) provides a platform-as-a-service for building, deploying and managing web apps. It supports multiple programming languages such as NodeJS/Express (JavaScript), .NET Core or PHP with frameworks like Laravel for building scalable, reliable and secure web applications. AppService also provides a range of features such as auto-scaling based on demand to ensure high availability with builtin load balancing, SSL offloading and more. It supports various databases including Azure SQL Database as a managed service for serverless database operations allowing users to manage their application' end-to endpoint communication without bothering about the underlying infrastructure. Furthermore, it offers webhook integration with GitHub and Azure DevOps providing continuous",
    "done": true,
    "done_reason": "length",
    "context": [
        32010,
        29871,
        13,
        5618,
        338,
        12634,
        2401,
        6692,
        29973,
        32007,
        29871,
        13,
        32001,
        29871,
        13,
        28413,
        8427,
        15538,
        313,
        2052,
        3170,
        29897,
        8128,
        263,
        7481,
        29899,
        294,
        29899,
        29874,
        29899,
        5509,
        363,
        5214,
        29892,
        7246,
        292,
        322,
        767,
        6751,
        1856,
        11446,
        29889,
        739,
        11286,
        2999,
        8720,
        10276,
        1316,
        408,
        9071,
        8700,
        29914,
        27404,
        313,
        16963,
        511,
        869,
        6006,
        10239,
        470,
        5048,
        411,
        29143,
        763,
        22238,
        363,
        5214,
        8716,
        519,
        29892,
        23279,
        322,
        11592,
        1856,
        8324,
        29889,
        2401,
        3170,
        884,
        8128,
        263,
        3464,
        310,
        5680,
        1316,
        408,
        4469,
        29899,
        19529,
        292,
        2729,
        373,
        9667,
        304,
        9801,
        1880,
        20847,
        3097,
        411,
        4240,
        262,
        2254,
        6411,
        19985,
        29892,
        17122,
        1283,
        13234,
        322,
        901,
        29889,
        739,
        11286,
        5164,
        21218,
        3704,
        12634,
        3758,
        5470,
        408,
        263,
        8745,
        2669,
        363,
        1923,
        2222,
        2566,
        6931,
        14372,
        4160,
        304,
        10933,
        1009,
        2280,
        29915,
        1095,
        29899,
        517,
        16248,
        12084,
        1728,
        24738,
        292,
        1048,
        278,
        14407,
        22035,
        12425,
        29889,
        16478,
        29892,
        372,
        16688,
        1856,
        20849,
        13465,
        411,
        25492,
        322,
        12634,
        9481,
        29949,
        567,
        13138,
        9126
    ],
    "total_duration": 17465699693,
    "load_duration": 3223211932,
    "prompt_eval_count": 15,
    "prompt_eval_duration": 775537000,
    "eval_count": 150,
    "eval_duration": 13421104000
}

JSON だと見づらいので、生成された回答のみ抽出しておきます。

Azure Application Services (AppService) provides a platform-as-a-service for building, deploying and managing web apps.
It supports multiple programming languages such as NodeJS/Express (JavaScript), .NET Core or PHP with frameworks like Laravel for building scalable, reliable and secure web applications. AppService also provides a range of features such as auto-scaling based on demand to ensure high availability with builtin load balancing, SSL offloading and more.
It supports various databases including Azure SQL Database as a managed service for serverless database operations allowing users to manage their application' end-to endpoint communication without bothering about the underlying infrastructure.
Furthermore, it offers webhook integration with GitHub and Azure DevOps providing continuous.

まとめ

Azure App Service の Sidecar に Phi-3 をデプロイして Web アプリケーションから呼び出してみました。
生成 AI 活用は大きく構えて LLM を使うまでもなく、Phi-3 をのような SLM で事足りるユースケースもあると思います。Smart Components のリポジトリでも、Ollama でセルフホストする構成が紹介されています。
github.com

Sidecar パターンで LLM や SLM をセルフホストする場合、リアルタイム応答、機密データ、コスト削減、ファインチューニングといったメリットを挙げることができます。
現時点では Public Preview なので足りない機能も多いですが、今後もキャッチアップしつつ、Sidecar パターンの使いどころを考えていきたいです。

今回のソースコードは、こちらのリポジトリで公開しています。
github.com