Foundry Localとは
今まで、Azure AI Foundryを使ってAI開発をしている人多かったと思います。しかし、いろいろ問題もありました。
- LLMおよび、関連リソースのお金がかかる(あたりまえ)
- 常時ネットワーク必要
- スロットリング(Token Per Minutes)がある
github.com
※ GitHubで公開されていますが、今のところオープンソースではありません。
いろいろ工夫することはできますが、特にTPMの制限回避するために前段にAPI Managementとか置くとお金的につらい。何とかならないかということできたのが、Foundry Localです(たぶん)。身もふたもなく、はっきり言えばMicrosoft版Ollamaです。圧倒的ないいところといえば、APIが既存のAzure OpenAI SDK互換です。今のAzure OpenAIのSDKのエンドポイント変えるだけで動きます(そのはず)。もちろん使えるものはローカルで動くモデルに限られます。 FoundryサービスがモデルはONIXランタイムを通じてモデルを呼び出します。
現在はチャットのみ対応です。マルチモーダルなんかはまだまだ先の話、かな。インストール後、foundry model listコマンドを使うと、Azureからモデルリストが取得できます。
Alias Device Task File Size License Model ID
-----------------------------------------------------------------------------------------------
phi-4 CPU chat-completion 10.16 GB MIT Phi-4-generic-cpu
--------------------------------------------------------------------------------------------------------
phi-3.5-mini CPU chat-completion 2.53 GB MIT Phi-3.5-mini-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------
deepseek-r1-1.5b NPU chat-completion 1.52 GB MIT deepseek-r1-distill-qwen-1.5b-qnn-npu
----------------------------------------------------------------------------------------------------------------------------
deepseek-r1-14b NPU chat-completion 7.12 GB MIT deepseek-r1-distill-qwen-14b-qnn-npu
---------------------------------------------------------------------------------------------------------------------------
deepseek-r1-7b NPU chat-completion 3.71 GB MIT deepseek-r1-distill-qwen-7b-qnn-npu
--------------------------------------------------------------------------------------------------------------------------
phi-4-mini-reasoning NPU chat-completion 2.78 GB MIT Phi-4-mini-reasoning-qnn-npu
CPU chat-completion 4.52 GB MIT Phi-4-mini-reasoning-generic-cpu
-----------------------------------------------------------------------------------------------------------------------
phi-3-mini-128k CPU chat-completion 2.54 GB MIT Phi-3-mini-128k-instruct-generic-cpu
---------------------------------------------------------------------------------------------------------------------------
phi-3-mini-4k CPU chat-completion 2.53 GB MIT Phi-3-mini-4k-instruct-generic-cpu
-------------------------------------------------------------------------------------------------------------------------
mistral-7b-v0.2 CPU chat-completion 4.07 GB apache-2.0 mistralai-Mistral-7B-Instruct-v0-2-generic-cpu
-------------------------------------------------------------------------------------------------------------------------------------
qwen2.5-0.5b CPU chat-completion 0.80 GB apache-2.0 qwen2.5-0.5b-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------
qwen2.5-coder-0.5b CPU chat-completion 0.80 GB apache-2.0 qwen2.5-coder-0.5b-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------------
qwen2.5-1.5b CPU chat-completion 1.78 GB apache-2.0 qwen2.5-1.5b-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------
qwen2.5-7b CPU chat-completion 6.16 GB apache-2.0 qwen2.5-7b-instruct-generic-cpu
----------------------------------------------------------------------------------------------------------------------
qwen2.5-coder-1.5b CPU chat-completion 1.78 GB apache-2.0 qwen2.5-coder-1.5b-instruct-generic-cpu
------------------------------------------------------------------------------------------------------------------------------
qwen2.5-coder-7b CPU chat-completion 6.16 GB apache-2.0 qwen2.5-coder-7b-instruct-generic-cpu
----------------------------------------------------------------------------------------------------------------------------
qwen2.5-14b CPU chat-completion 11.06 GB apache-2.0 qwen2.5-14b-instruct-generic-cpu
-----------------------------------------------------------------------------------------------------------------------
qwen2.5-coder-14b CPU chat-completion 11.06 GB apache-2.0 qwen2.5-coder-14b-instruct-generic-cpu
使用できるモデルはFoundry Localが自動的に判断するので、例えばCopilot + PCではNPUに対応したモデルが表示されますし、GPU(GeForce 20xx以降)では、GPUに対応したモデルも表示されます。私の環境はGeForce 2060 Tiなのですが、8GiBのVRAMがほとんど使われたとしてもちょっと遅いなぁ、という感じです。NPU持っているSnapDragon DevKitのほうが早い印象です。もちろんGeForce 50xxだとまた変わるのでしょう。
How to use
インストールはHomebrew(macOS)とwingetに対応しているので楽ですね。Windowsは Copilot + PCのNPCモデルも対応しています。モデルのダウンロードはAliasを指定すればFoundryが自動的にCPU/GPU/NPUを切り分けてくれるので、心配しなくてもいいです。
foundry model download phi-4
foundry model load phi-4
これでサービスが起動してモデルが読み込まれます。ちなみにモデルはWindowsの場合、 %userprofile%\.aikというフォルダーの中に格納されます。ほかのストレージに移動したい場合、foundry cache cd <path>で指定したところに移動できます。
一定時間(確か10分)アクセスがないと、サービスはモデルを開放します。その際は再度読み込んでください。もしくは後述のSDKを使えばプログラム内で読み込めます。
アクセス
(Azure) OpenAI SDKでアクセスできます。私が試した範囲ではなぜか.NET SDKでは404になってしまいました…なんか動かないんだよなぁ。.NET AspireでPythonオーケストレーションとかは普通に動きました。
SDK
Python用ですが、SDKもあります。コマンドでモデルロードして、とかではなくてPythonのSDK使ってFoundry Localの実行ができます。
from foundry_local import FoundryLocalManager
manager = FoundryLocalManager()
# List available models in the catalog
catalog = manager.list_catalog_models()
# Download and load a model
manager.download_model("phi-4-mini-reasoning")
manager.load_model("phi-4-mini-reasoning")
# List models in cache
cached_models = manager.list_cached_models()
# List loaded models
loaded = manager.list_loaded_models()
# Unload a model
manager.unload_model("phi-4-mini-reasoning")
モデルダウンロードして、ロードして、キャッシュの場所を取得して、アンロードして、というしょうもない感じのやつですが、例えばAspireにPythonオーケストレーションで参加して、動的にモデルをダウンロードして切り替えるなんてこともできます。もちろんメモリはそれなりにいるので、割とリッチな環境が必要になります。メモリ32GBは必須な感じですね。
from foundry_local import FoundryLocalManager
from openai import OpenAI
alias = "phi-4-mini-reasoning"
manager = FoundryLocalManager()
manager.load_model(alias)
# Windowsは5273/tcp。macOSでは5272/tcpが既定
client = OpenAI(
api_key="not-needed-for-local",
base_url="http://localhost:5272/v1"
)
client = openai.OpenAI(
base_url=manager.endpoint,
api_key=manager.api_key # API key is not required for local usage
)
# Set the model to use and generate a streaming response
stream = client.chat.completions.create(
model=manager.get_model_info(alias).id,
messages=[{"role": "user", "content": "What is the golden ratio?"}],
stream=True
)
# Print the streaming response
for chunk in stream:
if chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="", flush=True)
組み合わせてみるとこんな感じです。
まとめ
大多数の人にはOllamaから乗り換える理由はないのかもしれませんが、AI Foundry使っている人は便利だと思いますので、使ってみてください。
devblogs.microsoft.com