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