Ultralyticsがどのようにしてお好みのチップでYOLOモデルを高速化するのか
UltralyticsがCPU、GPU、エッジデバイスでYOLOモデルを高速化する方法をご紹介します。チップやメモリ、量子化、融合、プルーニングなどの効率的な手法について解説します。

Ultralyticsでは、コンピュータービジョンモデルを開発しています。つまり、コンピューターにものを見せる方法を教えています。モデルは巨大な数式レシピのようなものだと考えてください。演算(レイヤーと呼びます)と、重みと呼ばれる大量の数値で構成されています。
Ultralytics YOLOモデルは、画像を本来の姿、つまり数値の配列として処理します。各ピクセルは色の値にすぎず、画像を構成する各点の赤、緑、青の量(つまりRGB)を表します。この数値配列を「テンソル」と呼ぶのは、「多次元行列」より響きがよく、「数値を積み重ねたものをさらに積み重ねたもの」よりもずっと格好よく聞こえるからです。
画像をモデルに入力すると、ネットワーク内を壮大な旅へと進みます。テンソルがレイヤーを次々と通過し、変換され、畳み込まれ、美しいほど複雑な数学的処理を受ける様子を想像してください。数値がダンスパーティーで混ざり合い、猫を猫たらしめるものや車を車たらしめるものの本質を抽出するようなものです。このプロセスを特徴抽出と呼びます。
処理の最後に得られるのは何でしょうか。さらに多くの数値です。意味のある数値です。検出タスクでは、画像内の対象の位置と、その対象が何である可能性が高いかを正確に示します。「座標 (x, y) に犬がいる確率は95%です!」この魔法のようなプロセスを推論と呼びます。
モデルが力を発揮するには、まず学習させる必要があります。学習の過程は非常に大変です。
学習中、ネットワークに画像を提示するたびに、単に答えを得るだけではありません。特に重要な処理を2つ行います。まず、ネットワークがどれだけ間違えたかを計算します(これを損失と呼び、的の中心からの距離のようなものです)。次に、そしてこれが重要ですが、その損失に基づいてネットワーク内のすべての数値(つまり重み)を更新します。何千もの小さなつまみを一度に調整し、調整のたびにネットワークの精度を高めていくようなものです。
つまり、誤りを修正しながらネットワークを学習させます。間違えるたびに、してはいけないことを学び、似た画像を再び見たときに正解に近づけるよう、すべての重みを調整します。ネットワークは、間違いを一つずつ重ねながら正しい方向へ導かれ、やがて予測を的中させるようになります。
数値はいくつあるのでしょうか。小さなYOLO11nでも、パラメーターは数百万個あります。一方、YOLO11xにはなんと5,000万個を超えるパラメーターがあります。パラメーターが多いほど、表現できる詳細も増えます。クレヨンで描くのと、画家の絵の具一式を使うのとの違いのようなものです。
推論時には、このパラメーター数が非常に重要になります。300万パラメーターのネットワークを実行するのは、近所を軽くジョギングするようなものです。5,000万パラメーターのネットワークを実行するのは、燃え盛るたいまつをジャグリングしながらマラソンをするようなものです。
では、計算とは具体的に何でしょうか。この大量の数値計算は、実際にはどのように行われるのでしょうか。どうすれば高速化できるのでしょうか。そして、「計算の最適化」とはどういう意味なのでしょうか。
チップが実際に計算する仕組み#
計算はチップ上で行われます。シリコン製の小さな四角形は、宇宙で最も秩序立った砂の城のようなものです。コンピューターが行うあらゆる処理、加算、比較、あらゆる「もしこうなら、こうする」という処理は、シリコン上に物理的に作り込まれています。チップの特定の領域には、数値の加算専用の物理回路があり、別の領域には論理演算用の回路があります。さまざまな地域が異なる種類の数学を専門とする小さな都市のようなものです。
これは、コンピューター科学者であっても奇妙に聞こえるかもしれません。過去40年間、技術のラザニアのように抽象化を何層にも積み重ねてきた結果、最下層の皿すら見えないほど高くなってしまったからです。仕組みを単純化しすぎたため、現在のプログラマーの多くは、シリコン上で計算が実際にどのように行われているかを知りません。それは彼らの責任ではなく、そうなるように設計されているのです。
こうした層を一つずつ見ていきましょう。まずは、とてもシンプルなPythonコードです。
x = 1
if x == 1:
y = x + 1変数xを作成して1を設定し、xが1に等しい場合(答えはそのとおりです)、xに1を加えた値を持つyを作成します。わずか3行で、簡単です。
しかし、ここからが興味深いところです。この何気ない3行と、シリコン内を実際に動く電子との間では、少なくとも4つの大きな変換層が働いています(実際にはもっとありますが、デジタルコンテンツマネージャーによると、すでに文字数が多すぎて不安になるそうです)。この驚くべき道のりを順に見ていきましょう。
レイヤー 1: Python → バイトコード まずPythonがコードを読み込み、バイトコードと呼ばれる形式にコンパイルします。これはコンピューターが処理しやすい中間言語ですが、読もうとすると目が痛くなるようなものです。
レイヤー 2: バイトコード → マシンコード Pythonインタープリター(CPythonなど)がバイトコードを受け取り、プロセッサーが理解できる実際の命令であるマシンコードに変換します。この段階で、洗練された「if x == 1」は、「レジスターを読み込む、レジスターを比較する、ゼロフラグが設定されていればジャンプする」のような命令になります。
レイヤー 3: マシンコード → マイクロコード 意外かもしれませんが、最新のプロセッサーはマシンコードを直接実行するわけではありません。マシンコードをさらに、チップ内部のコンポーネントが処理できる、より小さなマイクロコードに分解します。1つの「ADD」命令が、複数のマイクロオペレーションになることもあります。
レイヤー 4: マイクロコード → 物理的な電子回路 最後にシリコンにたどり着きます。マイクロオペレーションが、トランジスターを流れる実際の電気信号を発生させます。何十億もの小さなスイッチがオンとオフを切り替え、電子が綿密に設計された経路を流れ、どういうわけか魔法のように1 + 1が2になります。
それぞれの層は、その下にある層の途方もない複雑さを隠すために存在します。ロシアの入れ子人形のようですが、人形ごとにまったく異なる言語を話し、最も小さな人形は文字どおり砂の中に閉じ込められた稲妻でできています。
皮肉なことに、Pythonのわずか3行が、何百万回ものトランジスタのスイッチ切り替えを引き起こしている可能性があります。しかし、こうした抽象化のおかげで、そのすべてを考える必要はありません。「y = x + 1」と書くだけで、シリコンの奥深くで魔法が起きると信頼できます。
アーキテクチャ#
あらゆる演算はシリコン上に物理的に実装されており、チップ上のどこで実行されるかはチップのトポロジーによって決まります。電子のための都市計画のようなものです。加算器はここに、乗算器はあそこにあり、それぞれが効率よく通信する必要があります。
市場には何百種類ものチップがあり、それぞれ用途に応じて設計されています。チップ間で何が異なるのでしょうか。物理領域で演算をどのように配置し、実装するかというトポロジーです。これをアーキテクチャと呼びます。実に多くの種類があります。
- x86(IntelとAMD)- デスクトップコンピューティングの大御所で、複雑ですが高性能です
- ARM - スマートフォンを動かし、ノートパソコンにも普及しつつある、省電力性を重視したアーキテクチャです
- RISC-V - オープンソースの異端児で、あらゆる分野で存在感を高めています
- PowerPC - IBMの強力なアーキテクチャで、現在もゲーム機やサーバーで使われています
- MIPS - 学術分野で人気のある、シンプルで洗練されたアーキテクチャです
- SPARC - Sun Microsystems(現在のOracle)が高性能コンピューティングに貢献したアーキテクチャです
- GPUアーキテクチャ(NVIDIAのCUDAコア、AMDのRDNA)- 並列処理の強力なアーキテクチャです
アーキテクチャごとにトランジスターの配置が異なるだけでなく、使う言語も異なります。これらのマシンに命令を送るための抽象化も、まったく異なります。相手の車に合わせて、フランス語や中国語、あるいは身振りで旅行の案内を書き分けるようなものです。
シリコンの鼓動#
チップを動かすのは電子、つまりチップに流れ込む電気であり、計算に必要なエネルギーを供給します。しかし、エネルギーだけでは十分ではありません。チップが実際に動作し、複雑なトポロジーに沿ってデータを移動させるには、重要な要素が1つ必要です。それがクロックです。クロックによって、電子は特定の経路を特定のタイミングで流れます。クロックがなければ、電力が供給されているだけのシリコンは何も実行できません。
何十億ものコンポーネントを完璧に同期させて動かす、大規模なパフォーマンスを調整するところを想像してください。拍子がなければ大混乱になります。プロセッサーにとってクロックが果たす役割は、まさにそれです。クロックは非常に安定した速度で振動する水晶で、1秒間に何十億回もの電気パルスを発生させます。
「3.5 GHzのプロセッサー」と聞くとき、そのGHz(ギガヘルツ)はクロック速度を表し、1秒間に35億回の拍に相当します。1回の拍をクロックサイクルと呼び、コンピューティングにおける時間の基本単位です。
クロックサイクルの間には何も起こりません。次の拍を待つ間、コンピューター全体が停止します。宇宙で最も極端な「だるまさんがころんだ」のようなものです。クロックパルスという「青信号」のたびに、次の処理が行われます。
- コンポーネント間でデータが移動します
- 計算が実行されます
- 論理的な判断が行われます
- メモリーの読み書きが行われます
単純な加算のように1サイクルで終わる演算もあれば、除算やRAMからのデータ取得のように複数のサイクルを要する演算もあります。何十億ものコンポーネントがそれぞれの処理を行い、絶え間ない拍子に同期して動く、綿密に振り付けられた動きです。
水晶の振動を速めると、プロセッサーをオーバークロックできます。すべての処理が速くなりますが、発熱が増え、安定性は低下します。限界を超えると、電子が拍子についていけなくなり、コンピューターがクラッシュします。
昔は、こうした演算を部屋ほどの大きさの機械で実現していました。しかし、計算を行うコンポーネントは驚くほど単純で、スイッチにすぎません。オンかオフかのスイッチです。
スイッチを十分な数だけ正しいパターンでつなげば、計算ができます。デジタル革命全体は、高度なスイッチの組み合わせに行き着きます。
この仕組みがシンプルだからこそ、どんなスイッチでもあればコンピューターを作れます。水道管とバルブ、ドミノ、LEGOブロック、ビー玉、さらにはMinecraftのレッドストーンを使って、実際に動作するコンピューターを作った人たちもいます。
基本原理は1940年代から変わっていません。スイッチを極めて小さく作る技術が飛躍的に進歩しただけです。スマートフォンは、人類を月に送ったすべてのコンピューターを合わせたよりも高い計算能力を持ち、それがポケットに収まるのは、原子スケールでスイッチを作る方法を見つけたからです。
何百万ものパラメーターを持つニューラルネットワークを実行するとき、こうした小さなスイッチを1秒間に何十億回も切り替え、水晶の鼓動に完璧に同期させています。重みの更新、行列乗算、活性化関数のすべてが、クロックの拍子に合わせて動きます。
モデルの学習中に、コンピューターが離陸しようとしているような音を立てるのも無理はありません。
ニューラルネットワークをブンブン回す#
さて、何十億ものスイッチが水晶の拍子に合わせて動くチップがあり、その上で何百万ものパラメーターを持つニューラルネットワークを実行したいとします。簡単そうですよね。数値をチップに放り込んで、あとは動かすだけです。
ニューラルネットワークを高速に実行するのは、冷蔵庫が3ブロック先にあり、フライパンが1つしかなく、材料がそれぞれ250キログラムある台所で、5品のコース料理を作るようなものです。計算そのものが最大の問題ではありません。それ以外のすべてが問題です。
アーキテクチャの不一致#
ほとんどのチップは、ニューラルネットワークではなくMicrosoft Wordを実行するために設計されました。CPUは、人生の大半をif文やループの実行、ときどき税金の計算(スーパーコンピューターでさえ気が滅入る計算です)に費やすものとして作られています。処理を順番に実行するように最適化されており、これを行い、次にあれを行い、その次に別の処理を行います。
しかし、ニューラルネットワークの仕組みはまったく異なります。すべてを同時に処理しようとします。学習中は、予測の誤差に基づいて何百万もの重みを更新します。推論、つまり学習済みモデルを実際に使うときは、何百万もの計算を並行してデータに適用します。100万個の数値に別の100万個の数値を掛ける必要があると想像してください。CPUは、非常に高速ですが几帳面な経理担当者のように、1つずつ処理しようとします。
そのため、GPUはAIコンピューティングの基盤となりました。GPUは、何百万ものピクセルの色を同時に計算する必要があるビデオゲーム向けに設計されました。ピクセルの色の計算とニューラルネットワークの演算には、驚くほど共通点があります。どちらも大量のデータに同じ演算を並列に適用するからです。
それでも、GPUはニューラルネットワークに最適とは限りません。そのため、各社は専用のAIチップ(TPU、NPUなど、PUで終わるあらゆる略語)を開発しています。こうしたチップは、ニューラルネットワークの高速化という1つの目的のために、ゼロから設計されています。1つの料理しか作れませんが、超人的な速さで調理するシェフを雇うようなものです。CPUが行列演算を順番に処理するのに苦労し、GPUが並列にうまく処理する一方、専用チップは朝昼晩と行列を処理します。
メモリーの壁(つまり、ビットの移動が計算より難しい理由)#
最新のニューラルネットワーク計算では、実際に計算するよりも、データの移動に多くの時間とエネルギーを費やしています。
コンピューターチップを、驚くほど速く計算できる優秀な数学者だと考えてください。ただし、参考書は町中の別々の建物に保管されています。どんな方程式でも瞬時に解けますが、まず数値を手に入れる必要があり、その移動には非常に時間がかかります。
チップは、2つの数値を1クロックサイクルで乗算できます(1秒間に何十億回もある拍の1回分です)。驚くほど高速です。しかし、メモリーからチップまで数値を取得するには、何百サイクルもかかる場合があります。数学者が問題を1秒で解けても、図書館まで歩いて往復するのに5分かかるようなものです。
原因は距離と空間です。電気は速く移動しますが、無限に速いわけではありません。チップ上でデータが移動する距離が長いほど、時間がかかります。コンピューターの設計者は、距離の異なる複数の保管場所を設けるメモリー階層を作ることで、この問題を解決しました。
- レジスター(演算ユニットに直接内蔵):数学者の机です。瞬時にアクセスできます。ただし容量は小さく、ここに置けるのは約32個の数値だけです。目の前に付箋を置くようなものです。
- L1キャッシュ(数マイクロメートル先):オフィスの本棚です。取り出すのに3~4サイクルかかります。ここには数千個の数値を保存できます。
- L2キャッシュ(数ミリメートル先):廊下の先にある書類棚です。アクセスに10~15サイクルかかり、数百万個の数値を保存できます。
- L3キャッシュ(チップの反対側):階下の倉庫です。アクセスに30~50サイクルかかり、数千万個の数値を保存できます。
- RAM(まったく別のチップ上):町の反対側にある倉庫です。アクセスに100~300サイクルかかります。何十億もの数値がここに保存されています。
- SSD/ハードドライブ(ケーブルで接続):まったく別の都市です。数百万サイクルかかります。容量は非常に大きいものの、速度は極めて遅いです。
正確な構成はさまざまです。スマートフォンのチップにはL3キャッシュがない場合があり、サーバーCPUには大量のL3キャッシュが搭載されている場合があります。しかし、基本原則は同じです。近くにあるメモリーほど高速ですが、容量は小さくなります。
ここからがニューラルネットワークにとって厄介な点です。Ultralytics YOLOモデルのパラメーター数が5,000万個だとしましょう(ちなみに、ChatGPTは数十億個です)。5,000万個の数値をメモリーと演算ユニットの間で移動させる必要があります。1つの数値がわずか4バイトだとしても、システム内を移動させるデータ量は200メガバイトになります。
チップは各数値を1サイクルで処理できても、RAMから数値を取得するのに100サイクルかかると、時間の99%をデータの到着待ちに費やします。F1マシンが渋滞にはまっているようなものです。膨大な計算能力がありながら、データが届くのを待つことになります。
重要なポイントは次のとおりです。これは最新のコンピューティングにおける最大のボトルネックです。フォン・ノイマン・ボトルネックと呼ばれています。チップの計算速度を高めるのは比較的簡単です。メモリーの高速化は、物理的な限界に直面しています。そのため、AIのパフォーマンス最適化のほとんどすべては、メモリーレベルで行われます。エンジニアがニューラルネットワークを高速化するとき、計算自体を速くすることはまれです。データの移動量を減らし、キャッシュを効率よく使い、より賢くアクセスする方法を見つけています。
最新のAIチップは、計算速度だけでなく、メモリー帯域幅とデータ移動の戦略にも力を注いでいます。データを先読みし、キャッシュ内の値を再利用し、メモリーへのアクセスを最小限に抑えるよう計算を編成します。AIハードウェア競争の勝者は、最速の計算器を持つ企業ではありません。計算器にデータを絶えず供給する方法を見つけた企業です。すべてはメモリーアクセスパターンの最適化にかかっています。
データを少し移動するたびに、エネルギーを消費します。消費量はわずかで、ピコジュール単位ですが、毎秒テラバイトのデータを移動すると、すぐに大きな量になります。実際、チップ上でデータを1mm移動させるには、計算そのものより多くのエネルギーが必要です。
ニューラルネットワークのトレーニング中にノートPCがジェットエンジンのような音を立てるのは、このためです。熱を発生させているのは計算ではなく、データの移動です。パラメーターの更新も、勾配の計算も、順伝播も、文字どおり部屋を暖めています。
最新のAIアクセラレーターは、基本的に熱力学の演習です。チップが溶ける前に、どれだけの計算を詰め込めるでしょうか。どれだけ速く熱を逃がせるでしょうか。オーバークロックのようなものですが、クロックは常に限界まで上がっていて、火事を起こさないようにするだけで精いっぱいです。
解決策は、アーキテクチャを考慮した設計です。#
最速のニューラルネットワークが、必ずしも最も賢いとは限りません。チップを考慮して設計されたネットワークが最速です。具体的には、次のような特徴があります。
- データをできるだけローカルに保持する
- 計算を徹底的に再利用する
- ハードウェアの能力にぴったり合わせる
- メモリーの移動を可能な限り最小限に抑える
これは、「近所の食料品店にある食材を使う」と書かれたレシピと、チベットからスパイスを、フランスからチーズを、南極から水を輸入する必要があるレシピとの違いのようなものです。どちらもおいしいかもしれませんが、実用的なのは明らかに一方です。
ニューラルネットワークを高速化することが、芸術の域に達するのはこのためです。優れた数式だけでは不十分です。ハードウェアを理解し、メモリー階層を尊重し、アーキテクチャと完璧に連携する必要があります。
コンピューターサイエンスと物理学、工学、そして純粋な魔法が出会う世界へようこそ。数値を移動させるコストが、その数値を計算するコストを上回る世界です。並列処理は高速ですが、同期は致命的です。最大の敵は複雑さではなく、距離です。
YOLOを高速化する方法#
YOLOモデルをトレーニングすると、トレーニング環境では見事に動作するニューラルネットワークが得られます。しかし、ゲーミングGPUとiPhone、そしてセキュリティカメラに搭載された小さなチップは、それぞれまったく異なる言語を話します。それぞれに異なる強みと弱みがあり、データ処理の方法も大きく異なります。
このように考えてみてください。GPUには数千ものコアがあり、すべてが同時に処理できます。つまり、並列処理向けに構築されています。一方、モバイルチップにはAI処理に特化した回路が搭載されている場合がありますが、処理できる計算の種類は限られています。そして、玄関のドアベルカメラに搭載されたエッジデバイスは、LED電球よりも小さな電力枠でAIを動かそうとしています。
Ultralyticsでは、12種類を超えるエクスポート形式をサポートしています。それぞれが異なるハードウェア向けに最適化されているためです。選択肢が多すぎるという話ではありません。お客様固有のニーズに合った選択肢を用意することが大切です。
演算の融合:少ないリソースでより多くの処理を実現#
元のYOLOモデルでは、多くの演算が順番に実行されます。たとえば、畳み込みを行い、結果を正規化してから、活性化関数を適用する場合があります。これらは3つの個別のステップで、それぞれにメモリーの読み込みと書き込みが必要です。
しかし、ここが巧妙なところです。これらの演算を1つのステップにまとめることができます。YOLOをデプロイ用にエクスポートするときに、これらの演算を融合します。次のように処理する代わりに、
- 畳み込みを計算 → メモリーに保存
- メモリーから読み込み → 正規化 → メモリーに保存
- メモリーから読み込み → 活性化を適用 → メモリーに保存
次のように処理します。
- 畳み込み + 正規化 + 活性化を計算 → メモリーに保存
640×640の画像を処理する一般的なYOLOモデルでは、この簡単な手法によって、不要なメモリー転送を数GB分削減できます。モバイル端末では、これによりリアルタイム検出がスムーズに動作するか、遅延に悩まされるかが決まります。
より小さな数値を使う:量子化の力#
YOLOが物体を正確に検出するために、極めて高精度な数値は必要ありません。トレーニング時には各重みを32ビットで表します。これは、サンドイッチの材料を量るために関数電卓を使うようなものです。実際のデプロイでは、8ビットで十分です。
これは量子化と呼ばれ、最も強力な最適化手法の1つです。より小さな数値を使うことで、次のような効果が得られます。
- モデルのサイズが75%縮小します(Ultralytics YOLO11xの場合、200MBから50MBになります)。
- ほとんどのデバイスで2~4倍高速に動作します。
- 消費電力を大幅に削減できます(スマートフォンのバッテリーにもやさしいです)。
YOLOのすべてのレイヤーが、この精度低下の影響を同じように受けるわけではありません。基本的なエッジや形状を検出する初期レイヤーは堅牢なため、問題なく8ビット数値を使えます。「これは猫か犬か」を判定する最終検出レイヤーには、もう少し高い精度が必要です。そのため、精度をレイヤーごとに調整し、正確さを保ちながら速度を最大化できる最小限のビット数を使います。
慎重に量子化すれば、Ultralytics YOLOは元の精度の99.5%を維持しながら、スマートフォン上で3倍高速に動作することがわかっています。これこそ、研究用モデルと、実際の現場で使えるモデルの違いです。
最適なアルゴリズムの選択#
同じ数学演算を実行する方法は何十通りもあります。YOLOの中核となる演算である畳み込みも、まったく異なるアルゴリズムで計算できます。最適な選択肢は、具体的なハードウェアと入力サイズによって異なります。
YOLOをエクスポートするとき、最適化フレームワークが実際に複数のアルゴリズムをテストし、特定のケースで最速のものを選びます。目的地までの複数のルートから、現在の交通状況に応じて選ぶようなものです。GPUでは、多数のピクセルを同時に処理するアルゴリズムを使う場合があります。CPUでは、逐次処理向けに最適化されたアルゴリズムを使う場合があります。数式は同じですが、実行方法はまったく異なります。
メモリー:隠れたボトルネック#
現代のコンピューティングでは、メモリーが真のボトルネックだと説明したことを覚えていますか。これは特にYOLOに当てはまります。モデルのパラメーター数が5,000万に達することもあり、推論中には中間結果が数GB分生成されます。このデータをすべて移動させる処理は、実際の計算より遅いことがよくあります。
メモリーの移動を最小限に抑えるため、いくつかの手法を使います。
スマートスケジューリング:データが高速なキャッシュメモリーにあるうちに、すぐ使われるよう演算を配置します。YOLOの特徴ピラミッドネットワークでは、これによってメモリー転送量を40%削減できます。
タイル分割:画像全体を一度に処理するのではなく、キャッシュに収まる小さなタイルに分割します。これにより、プロセッサーは低速なメインメモリーから頻繁にデータを取得せずに、高速なローカルメモリーを使って処理できます。
バッファーの再利用:中間結果のために新しいメモリーを何度も確保するのではなく、同じメモリーバッファーを再利用します。非常に効率的な方法で、YOLOのバックボーン全体を、再利用可能なバッファー群だけで実行できます。
プルーニング:少ないほど効果的#
意外かもしれませんが、YOLOモデルは過剰に設計されていることがよくあります。多くのレイヤーでチャネルの30%を削除しても、精度への影響はほとんどありません。これは単にモデルを小さくするだけではありません。実行する計算が文字どおり減るため、高速化にもつながります。
このプロセスは洗練されています。ネットワークのどの部分が最終的な検出結果への貢献度が低いかを分析し、それらを削除してから、影響を補うためにモデルをファインチューニングします。プルーニングしたYOLO11mモデルは、元の精度の99%を維持しながら30%高速化できます。バッテリー駆動デバイスでは、この効率向上により、動作時間を数時間延ばせる場合があります。
ハードウェアアクセラレーション:各チップの強みを活かす#
プロセッサーによって得意な処理は異なり、性能差は驚くほど大きくなります。同じYOLO11nモデルでも、次のような処理時間になります。
- 最新のIntel CPUでは、フレームあたり45ミリ秒
- NVIDIA RTX GPUでは、4ミリ秒
- ハイエンドのスマートフォン用プロセッサーでは、22ミリ秒
- Google CoralエッジTPUでは、15ミリ秒
これらはクロック速度だけによる差ではなく、根本的なアーキテクチャの違いを反映しています。GPUには数千ものコアがあり、並列処理を行うため、YOLOの畳み込みに最適です。モバイルNPUには、ニューラルネットワーク専用に設計された回路があります。CPUは万能型で柔軟ですが、特定の処理に特化していません。
最適化の鍵は、YOLOの演算を各チップの得意分野に合わせることです。GPUは大量のデータに対する同じ演算を、同時に実行するのが得意です。モバイルNPUは対応する演算が限られる場合がありますが、対応する演算は非常に効率的に実行します。エッジTPUは8ビット整数しか扱えませんが、その制約の中で驚異的な速度を実現します。
コンパイルの力#
YOLOモデルをエクスポートすると、裏側で驚くべき処理が行われます。単にファイル形式を変換するのではなく、対象のハードウェア専用にモデルをコンパイルします。これはGoogle翻訳とネイティブスピーカーの違いのようなものです。コンパイル処理では、次のことを行います。
- モデルを分析して、その構造と要件を把握します。
- ハードウェアの能力を考慮し、得意な処理と苦手な処理を判断します。
- 最適化されたコードを生成し、ハードウェアのネイティブ言語に合わせます。
コンパイラーは、プロセッサーのキャッシュをより有効に使えるよう演算を並べ替えたり、チップがサポートする専用命令を選択したり、機械学習を使って最適な最適化戦略を見つけたりします。そうです。AIを使ってAIを最適化しています。未来はすでに始まっています。
このコンパイル処理によって、性能に10倍の差が生じることがあります。同じYOLOモデルでも、汎用コードでは低速でも、適切に最適化された命令を使えば高速に動作します。
現場でのエッジデプロイ#
YOLOが現実の世界、特に厳しい環境であるエッジデバイスで使われるとどうなるか見てみましょう。物体検出のためにYOLOを24時間365日実行する必要があるセキュリティカメラを想像してください。次のような厳しい制約に直面します。
- メモリー:RAMの合計は512MBから2GB程度の場合もあります。
- 電力:多くの場合、わずか2~5ワットです(スマートフォンの充電器より少ない電力です)。
- 冷却:ファンはなく、自然放熱だけです。
- 信頼性:クラッシュせずに連続稼働する必要があります。
最適化によって実際に何が実現するか見てみましょう。YOLO11sを実行するセキュリティカメラの場合、次のようになります。
- 元のモデル:15ワット、85°Cまで発熱し、20 FPSを達成
- 量子化とプルーニングで最適化:3ワット、快適な45°Cで動作し、25 FPSを達成
消費電力を80%削減しながら、性能も向上させました。過熱してバッテリーを消耗するデバイスと、何年も安定して動作するデバイスの違いはここにあります。
鍵となるのは、適切なトレードオフを選ぶことです。エッジデバイスでは、次のような方法をよく使います。
- INT8量子化を使う(精度は下がりますが、消費電力を大幅に削減できます)。
- 動きが少ないときは、処理するフレーム数を減らす
- 異なるプロセッサーに処理を分散して、発熱を管理する
- モデル全体が高速メモリーに収まるサイズを維持する
最適化のプロセス#
Ultralyticsでは、体系的なアプローチで最適化を進めています。まず、モデルをプロファイリングして、実際にどこで時間が費やされているかを把握します。ボトルネックは、予想とは異なる箇所にあることがよくあります。たとえば、わずかなレイヤーに処理時間の80%が費やされていたり、メモリー転送が計算時間の大部分を占めていたりします。
次に、最適化を段階的に適用します。
- 最も大きなボトルネックから着手する
- 一度に1つの最適化を適用する
- 速度の向上と精度への影響の両方を測定する
- トレードオフに優れた最適化を採用する
- 目標に達するまで繰り返す
たとえば、スマートフォンでYOLO11mをデプロイする場合、次のようになります。
- ベースライン:フレームあたり200ms、モデルサイズ200MB
- 量子化後:フレームあたり80ms、モデルサイズ50MB
- プルーニング後:フレームあたり60ms、モデルサイズ35MB
- 演算の融合後:フレームあたり45ms、モデルサイズ35MB
各ステップで元の精度の99%超を維持しながら、性能が向上します。その結果、ポケットに入るサイズのデバイスでリアルタイム物体検出が可能になります。
未来:ヘテロジニアスコンピューティング#
最新のデバイスは、複数のプロセッサーを連携して使う方法をより賢く判断できるようになっています。スマートフォンにはプロセッサーが1つだけ搭載されているわけではありません。タスクごとに特化したプロセッサーが複数搭載されています。
- カメラセンサーには、前処理用のISP(画像信号プロセッサー)が搭載されています。
- NPU(ニューラル処理ユニット)がYOLOの推論を実行します。
- CPUが複雑なロジックと連携処理を担います。
- GPUが画面上に結果を描画します。
YOLO最適化の未来は、モデルをこれらのプロセッサーにインテリジェントに分割することにあります。NPUが主要な畳み込みを処理し、CPUが最終的な検出ロジックを実行し、GPUが結果を可視化する、といった分担が考えられます。各プロセッサーが得意な処理を担当することで、単一のプロセッサーでは実現できないほど効率的なパイプラインを構築できます。
利用可能なプロセッサーにYOLOを最適に分割する方法を自動的に判断する、スマートな分割アルゴリズムを開発しています。プロセッサーの能力だけでなく、プロセッサー間のデータ移動にかかるコストも考慮します。
要点#
YOLOモデルの最適化は、単にファイル形式を変換することではありません。最先端のAIを、現実の世界で実際に機能するものへと変えることです。量子化(小さな数値の使用)、プルーニング(不要な部分の削除)、演算の融合(ステップの統合)、スマートなメモリー管理などの手法により、精度を維持しながら性能を10~100倍向上させます。
注目すべき点は、誰にでも当てはまる「最適な」最適化は存在しないことです。無制限に電力を使えるクラウドサーバーと、バッテリー駆動のドローンでは、必要な最適化が異なります。専用AIチップを搭載したスマートフォンとRaspberry Piでは、適切なアプローチが異なります。そのためUltralyticsでは、さまざまなシナリオに最適化された多数のエクスポートオプションを提供しています。
これまでに説明したすべての最適化は、コンピュータービジョンをあらゆる場所で利用できるようにするという1つの目標に役立ちます。スマートドアベル、ドローンアプリケーション、大規模なクラウドサービスのいずれを開発する場合でも、お客様の制約に合わせてYOLOを動作させるためのツールを提供します。
UltralyticsでYOLOモデルをエクスポートするとき、単にファイルを保存しているわけではありません。ニューラルネットワークの実用化に向けた長年の研究成果を活用しています。最先端のAIモデルを、実際のハードウェア上で、現実の制約のもと、実際の問題を解決できるものへと変換しています。
それがUltralyticsの取り組みです。AI研究と実用的なデプロイの間にあるギャップを埋めています。AIの未来は、最高のモデルを持つことだけではなく、モデルを実世界で役立てることにあるため、あらゆる場所でコンピュータービジョンを活用できるようにしています。










