kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Microsoft Ignite 2025初日の感想など

まとめて書くなら現地よりも日本で見ていたほうがいいような気もします😉。徹夜同然で頑張って書いていただけている方もたくさんいるので。

マイクロソフト Ignite 2025 ニュースブック

私は今回機会をいただいて、USで現地参加しています。現地じゃないとわからないこととしてはこの辺。

  • セキュリティ厳しくなった
  • 現地のデモ
  • 移動は大変
  • 直接会えるのはいいね

セキュリティ厳しくなる

前回のBuildの時と同じようですが、環境保護団体?によるデモや活動により、会場入るときにPhoto ID(外国人だとパスポート)を見せて、バッグを開けて見せないといけないのはなかなか手間でした。キーノート会場でもあって、私は一番乗りでしたが、セキュリティチェックのためにゆっくり(8時くらいとか?)に来た人は多分キーノート開始に間に合ってないと思います。

動画配信で入っているかわかりませんが、最後のAdobeの人との対談の時にデモ団体が会場入り口を超えて入ってきたらしく、外で声がしていました。キーノート終わった後も別のビルへの移動時にデモ団体が声を上げていて、遠回りすることになりました。直接的な人的被害が起きそうな感じはしませんでしたが、ちょっとびっくりした出来事でした。

オフィシャルなパーティないのもこの辺が理由なのかなぁ、とはなんとなく思っていました。パートナー主催の小規模パーティはいくつかあるので、そこでただ飯(違)、食いつないでいこうと思っています。サンフランシスコ高い。バーでビール小瓶よりももうちょっと小さいの飲んだら$12って…。酒税が高い日本と変わらないどころではない値段でした。

移動大変

会場は四つ、MosconeのNorth, South, WestとMariottです。シアターセッションも分かれているので、なかなか大変。休み時間は多いので、移動できなくはありませんが、計画的に移動しないと間に合わないですね。入場も長蛇の列になっているし。

私は「録画で見える奴は知っている製品グループやPMの人がしゃべるやつ以外は無理にいかない」、「録画がないラボやシアターセッション中心」で行こうかなということで計画建てたら…まぁ割と時間が重なる。もともとLabは2時間くらいあるのでオーバーラップしています。そうなるとラボ中心の時間割になっちゃいますね。

直接会いましょう

昨日参加するセッション終わった後、何気にHubに行ったらGitHubのブースにMartinがいたので、写真撮ってもらいました。すぐに話したいことがあっていったわけじゃなく、なんとなくよったらいたのですが、こういうのは現地ならではですね。

各種アクティビティも時間ある範囲で楽しめました。SurfaceのIntel Coreモデル(日本だと法人も出るしかないうえに英語キーボードはない)が15% offなのがなー日本でもちょうどブラックフライデーセールで17-20% offやってますが、英語キーボードが買えるのがなぁ。Core i7 32GB RAM /512GB SSDモデルが$2000くらいだそうです。

キーノートやセッションから

Agent FactoryやAgent 365はいろいろ面白いですね。なんちゃら(いろいろ)IQでコンテキストの話とか、出てきて順当進化、という感じでした。そのあと「Agent増えると前のローコードとかマクロみたいに野放図にできて困るけど、どうすれば」みたいな感想を同行者から聞いたのですが、決定的に違うのは「管理をやろうと思ったらできる」点。クラウドでちゃんとコントロールやる気があるならばできるネタはあるので、あとは底をどうやって行くかの話が大きく違います。

使われていないエージェントはちゃんと見える(はずな)ので、そこは運営側がモニタリングしていくしかないですね。

AnthropicのモデルがMicrosoft Foundryで使えるようになるというのはかなり驚きました。先日OpenAIのモデルがAWSで使えるようになったときは、各種事前報道から「まぁそうなるかなぁ」という印象でしたが、こちらはやるとは思ってなかったというか、成立すると思ってなかった。

キーノートはこういう優先席あるのありがたいですね。

セッションもいくつか見たのですがBuildでもあったAzure DevOps + GitHubのコラボレーションの話。苦しいながらもDanからAzure BoardsからCoding Agent実行させる話ちゃんと説明聞けたのはよかった。ライセンス的には費用負担はない(GitHub Enterprise Cloudを持っている場合の話)ので、管理Boardのほうが、という向きにはいいと思います。だいぶissueも近づいてきましたけどね。

シアターセッションでSRE Agentの話を聞いてきたのですが、ようやく使えるところが見えてきたな、という機能強化でした。これでAOAI Dev Dayの話しようかな(使えるかな?)。

キーノートのAzureとかWindowsとかの成分もっと…Scott Guも出番ちょっとで寂しい。あのデータセンター日本に持ってきてくれよ。

おまけ

こんな風にMVP Wallに名前があるとモチベが上がります。

でっかいSurface Pen。

ぱーりー

Day-0でMVP ConnectというイベントをGitHub本社でやってくれたので参加しました。Universeの縁台がまだ残ってたw。まんま倉庫みたいな本社でした。

Microsoftのドキュメントはなぜ「わかりにくい」といわれるのか

Xでも社内でもしばしば「Microsoftのドキュメントがわかりづらい」という声を聴きます。私は印刷物のころから…それこそMS-DOSの時代から、ずーっと見ていたので、慣れきってしまったのか、「わかりづらい」とはあまり思っていません。もちろん初めて聞く概念や初めて学ぶ分野(例えば認証で使う標準技術に関連するところ)に関してはわかりづらいではなく、「知らない」のとMicrosoft外の技術に関しては本来の規格の仕様書を読むのが筋です。標準規格の部分に関しては軽く書かれることもありますが、それを求めるのは酷というか、対象外でいいでしょう。

で、ここではいくつかのタイプを想定して考えてみます。対象は .NET とAzureとしてみます。ほかのドキュメントでも大して変わらないかもしれませんが、私がよく見るのがこのへんなので。

Xのような140文字で「わかりづらい」では何がわからないのかわからないので、この辺はいろんな人の話を聞いてみたいと思っています。誤訳とかは「わかりづらい」ではなくドキュメントのミスなので対象外です。翻訳レポジトリへの貢献いろんな騒動で受けてくれなくなったのは残念です。

完全な未経験者

一部には初学者向けの部分もありますが、私の理解ではMicrosoft Learnは未経験者向けというドキュメントにはなっていないと思います。MCPのxx-900試験を少なくとも初見で受かるような人じゃないと難しいんじゃないかなぁ、と思います。

なので、完全な初学者はLearnで学ぶのではなく(Learnも使いつつ)、別の参考書とかIT基礎的な話が先かなと思います。

何度かAzureや.NETでシステムを作っている人

前提としてMicrosoftの用語はある程度理解できるものとします。これはおそらく日本語の機械翻訳に引っかかるケースかな、と思います。最新のものを除いて、かなりのドキュメントが日本語されるのですが、以前のニューラルネットワークベースのものはお世辞にもわかりやすいとは言えないのかな、と思います。LLMベースになってくるかもしれませんが、製品の名称であるとか、Build開発と訳すようなやつですね。

こういうのがちょいちょい引っかかってストレスになってわかりにくさを助長しているというのは理解できます。

Microsoft Learnの翻訳は今かなり少なくなっていると思いますが、人間が翻訳しているものと機械翻訳とが混在しています。今LLMでの翻訳はかなり良くなっているので、あとはプロンプトなどでうまく訳さないところの指示ができれば改善していくかもしれません。私もLLM使って翻訳することあります。

あと、Microsoftが古い(サポート切れた製品の)ドキュメントどんどん消しているのもある意味わかりにくさを助長していると思います。古いものからの積み重ねで「昔はいいコンテンツがあったんだけど」というものも消えて行っています。今はさすがに少なくなったと思いますが、例えばMFCを使わない素のWin32のプログラムの作り方みたいなコンテンツはいいのあったんですが、今はどこに…という感じです。

過去の知識や経験がある人なら気にならない(かもしれない)ことでも、その前提の資料がなくなると新規でやっていく人はどこを見ればいいのかわかりづらいのはあるかなと思っています。

他社サービスを普段使っていて、都合でAzureや .NET を使わなくてはならなくなった人

はじめてMicrosoftのドキュメントを読むことになった人。クラウドの基本知識はあるが、普段使いの用語に慣れきっていて、Microsoftの用語はほとんど知らないとします。おそらく多くの「わかりにくい」と言っている人はここじゃないかなと想像しています。違ったら教えてください。

ここは難しいですね。私も仕事でAWSやOracle, VMwareやRed Hatのドキュメント読みますけど、どこもそれなりに「どこにあるんだ」というケースが多いです。たいていは検索で見たいページ一発で当てられるし、今は生成AIによる検索も便利です。とはいえ、必ずリンク先はみるし、なんなら公式以外探すなとも指示します。

仮に「AWSではこうだからAzureもこうだ」という先入観でlearnを読んでいるとわかりにくいと思います。そうじゃないことがあるかもしれませんが。私AWSのドキュメント読むときは、別物としてAzureことは頭から落として読むようにしています。あと、Azureはどうしてもオンプレミスを含むハイブリッドやライセンスのことも考えると「どこに書いているんだわかりづらい」という点はそうだと思います。

あと、重要な点としては関連ドキュメントをちゃんと読むことかなと思います。私は検索で希望のページが出ても、この上のようにツリーの同じレベルのほかのドキュメントも必ず全部読んでいます。必要ないかもしれないけど、後で「書いてあった」とか「あ、この条件でダメなんだ」ということが割とわかります。

検索はたいてい「この内容が書いてあるはず」という英単語(日本語ではなく)を指定して、site:learn.microsoft.comで検索しています。英語のページが出てきますが、まぁ気にせずブラウザー翻訳使っています。

Azure SRE AgentとAIを使った開発について

sukiyanenazure.connpass.com

すきやねんAzureでAzure SRE Agentの話をちょっとしてきました。公開プレビューですが申し込みが必要です。

speakerdeck.com

資料はこちらからどうぞ。SRE Agent面白くはあるのですが、「監視をがっちり組んでいて、Application Insights(など)のエラーが読める人なら無理に入れる必要ないんじゃないかな」というのが現在の感想です。

メリット

  • オンボードしているリソースを複数同時に一つのチャットで会話して調べられる
  • エージェントはちゃんと利用者のセキュリティを尊重してくれる(権限のないリソースは調べられない)

もう一つがんばれ

  • サブスクリプション毎にエージェント作らないといけないため、Hub-Spokeモデルの場合Spokeごとに必要になる(ため、大規模環境では高くなる)。現在サブスクリプションを指定してプレビューなのでこれはまぁしょうがない。Azure Lighthouseのようにそれこそテナント単位で委任できるようになれば本番というか、相当使いやすくなりそう。
  • Azure Network Perimeterやprivate endpoint対応してほしいですね。今のところパブリックアクセスのものだけなので。
  • やっぱりAzure VM対応が欲しいですね。SQL Server拡張機能とかもあるように、拡張機能経由で何とかしてほしいと思います。

今のところ一時間あたり60円くらい。プレビュー料金なのか、正式料金なのかわかりませんが(Azureの場合プレビュー期間中は半額のことが多い)、ひと月動かすと約4.3万円。これを高いとみるか安いとみるかはそれぞれかな、と思います。チャットすると別料金が必要ですが、それはまぁほとんど軽微なので、誤差的なやつ。

azure.microsoft.com

Build 2025で公開されたFoundry Localを試す

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