推論最適化・実行基盤

BentoMLとは|速い用途と遅い用途を同居させたら、待ちが0.0msから62,968.2msになった

同じ単位に複数のAPIを置くとどうなるのか用途ごとに分けると何が変わるのか入れ替えにどれだけかかるのか

速い用途と遅い用途を同じ入れ物に置くと、速いほうの待ちが62,968.2msになりました。

遅い用途を別の入れ物へ出せば0.0msです。同じ受け口を使うかどうかで決まります。

この記事の要点

  • 同居で62,968.2ms
  • 別にすれば0.0ms
  • 分けると5枚必要
  • まとめると3枚

遅い用途を同居させると、速い用途の待ちが63秒になる

1つの単位に複数のAPIを置けます。ただし受け口を共有するので、遅いほうに引きずられます。

BentoMLでは、1つの単位に複数のAPIを置けます。公式はServiceの中の各APIは、Pythonの関数として指定する形で定義されると述べています。

置いた用途の速さが違うとどうなるのか。実際に流して数えました。

遅い用途の件数を変える

text
1つの入れ物に「速い用途(25ms)」と「遅い用途(900ms)」を置く
受け口は 4 本。速い用途は毎秒 20件で固定し、遅い用途の件数を変える

遅い用途の件数  速い用途の平均待ち          95%点  遅い用途だけ別にした場合の速い用途
        0.2件/秒              0.0 ms          0.0 ms               0.0 ms(95%点 0.0 ms)
          1件/秒              4.7 ms          5.9 ms               0.0 ms(95%点 0.0 ms)
          2件/秒             52.8 ms        384.2 ms               0.0 ms(95%点 0.0 ms)
          4件/秒          62968.2 ms      95547.9 ms               0.0 ms(95%点 0.0 ms)

遅い用途が毎秒0.2件なら、速い用途の待ちは0.0msです。同居しても気づきません。

毎秒4件になると62,968.2msです。63秒待たされます。速い用途の件数は変えていません。

段差になっている

毎秒2件では52.8msでした。そこから4件で1,200倍に跳ねます。

受け口4本に対し、遅い用途が毎秒4件×0.9秒で3.6本ぶんを占めるからです。速い用途に残るのは0.4本です。

右端を見ると、別の入れ物へ出せばどの行も0.0msです。分けるかどうかだけの差でした。

受け口が埋まった瞬間に、待ちが桁で跳ねる。

速い用途の平均待ち(ms)遅い用途の件数(件/秒)→692654.40.2件/秒1件/秒2件/秒4件/秒受け口4本・速い用途は毎秒20件で固定。別の入れ物へ出せば、どの点でも0.0msになる。
図1 ── 遅い用途の件数と、速い用途の平均待ち
出典BentoML 公式ドキュメント「Hello world」2026-08-18 確認
Each API within the Service is defined using the @bentoml.api decorator, specifying it as a Python function.
原文BentoML 公式ドキュメント「Hello world」 この内容の有効期限2027-02-18

用途ごとに分けると5枚、まとめると3枚

配置の単位はServiceです。分ける数がそのまま必要な枚数になり、余りが積み上がります。

BentoMLでは、Serviceが配置の単位です。公式はBentoMLにおいてServiceとは、配置でき大きさを変えられる単位であり、Pythonのクラスとして定義されると述べています。

分ける数で枚数がどう変わるのか。実際に数えて比べました。

4つの用途を載せる

text
4つの用途を載せる。1枚 16GB・1枚がさばけるのは毎秒 60件

用途        重み      毎秒の件数    分けた場合に必要な枚数    余る容量    余る処理力
要約          2.4 GB            6件                    1枚     13.6 GB         54件
分類          0.9 GB           40件                    1枚     15.1 GB         20件
埋め込み        1.3 GB           90件                    2枚     30.7 GB         30件
翻訳          3.1 GB            2件                    1枚     12.9 GB         58件

まとめ方              必要な枚数    使った容量        使った処理力      余りの割合
用途ごとに分ける                        5枚       7.7/80 GB          138/300件         90.4%
1つにまとめる                         3枚       7.7/48 GB          138/180件         84.0%

分けると5枚、まとめると3枚です。使う容量は同じ7.7GBで、変わったのは枚数だけでした。

翻訳は毎秒2件しか来ないのに1枚を占めます。12.9GBと58件が余ります

どちらも余りは大きい

余りの割合は90.4%と84.0%です。まとめても8割以上が余ります。1枚が大きすぎるためです。

つまり枚数を減らす手は、まとめるより小さい機材を選ぶほうが効きます。

ただし前の節で見たとおり、まとめると巻き添えが起きます。Kubernetesの記事で扱った同居の判断と同じ形です。

出典BentoML 公式ドキュメント「Hello world」2026-08-18 確認
In BentoML, a Service is a deployable and scalable unit, defined as a Python class using the @bentoml.service decorator.
原文BentoML 公式ドキュメント「Hello world」 この内容の有効期限2027-02-18

30GBの重みだと、1本ずつの入れ替えに277秒かかる

状態と一生を扱えます。入れ替えのときは、重みの読み込みがそのまま所要になります。

BentoMLのServiceは、状態とその一生を扱えます。公式は状態とその一生を管理でき、HTTPを通じて到達できる1つまたは複数のAPIを外へ出せると述べています。

入れ替えのときに何が効くのか。実際に計算して数えました。

重みの大きさを変える

text
重みを読み込む速さを 毎秒 900MB、それ以外の準備を 12秒として計算する
同じものを 6 本立てている場合の、入れ替え中に減る処理力を見る

重み      読み込み      起動まで      1本ずつ入れ替え      半分ずつ入れ替え      全部同時
  0.5 GB        0.6秒       12.6秒           75秒 / 減 17%             25秒 / 減 50%        13秒 / 減 100%
    2 GB        2.3秒       14.3秒           86秒 / 減 17%             29秒 / 減 50%        14秒 / 減 100%
    8 GB        9.1秒       21.1秒          127秒 / 減 17%             42秒 / 減 50%        21秒 / 減 100%
   30 GB       34.1秒       46.1秒          277秒 / 減 17%             92秒 / 減 50%        46秒 / 減 100%

0.5GBなら起動まで12.6秒で、そのうち読み込みは0.6秒だけです。準備の12秒が大半を占めます。

30GBだと読み込みが34.1秒になり、逆転します。ここから先は重みが効いてきます。

入れ替え方で3倍変わる

30GBを1本ずつ入れ替えると277秒、半分ずつなら92秒です。3倍の差があります。

そのかわり落ちる処理力が17%から50%になります。時間と余力の取り替えです。

余談 この計測での注意

3つの計測はいずれも手元で書いた模型で、実際のBentoMLを動かしたものではありません。1枚16GB・毎秒60件、読み込み毎秒900MB、準備12秒といった値はすべて置いたものです。受け口4本という前提も置いた値で、実際の設定によって巻き添えの起きる位置は動きます。用途ごとの重みと件数も想定にすぎません。ここで見せているのは、受け口が埋まった瞬間に待ちが桁で跳ねるという点と、まとめても余りは8割以上残るという点の2つです。

出典BentoML 公式ドキュメント「Hello world」2026-08-18 確認
It can manage states and their lifecycle, and expose one or multiple APIs accessible through HTTP.
原文BentoML 公式ドキュメント「Hello world」 この内容の有効期限2027-02-18

よくある質問

BentoMLのServiceとは何ですか
配置でき、大きさを変えられる単位です。Pythonのクラスとして定義すると説明されています。
1つの単位に複数のAPIを置けますか
置けます。ただし速い用途と遅い用途を同居させると、速いほうの待ちが伸びました。
用途ごとに分けると何が変わりますか
枚数です。この計測では、分けると5枚、まとめると3枚でした。
入れ替えにはどれだけかかりますか
重みの大きさで決まります。30GBなら起動まで46.1秒、1本ずつ入れ替えると277秒でした。

まとめ

  • Serviceが配置の単位
  • 同居は巻き添えを生む
  • 分けると枚数が増える
  • 入れ替えは重みで決まる

今日から始められること

  1. 1つの単位に置いているAPIを数える
  2. 処理時間の差を測る
  3. 用途ごとの必要な枚数を出す
  4. 重みの大きさから起動時間を見積もる

実務で組んだBentoMLのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る