Ultralyticsがお好みのチップでYOLOモデルを高速化する方法
UltralyticsがCPU、GPU、エッジデバイス全体でYOLOモデルを高速化する方法をご紹介します。チップ、メモリ、量子化、融合、プルーニングなどのスマートな技術について説明します。

Ultralyticsでは、コンピュータビジョンモデルを開発しています。つまり、コンピューターにものを見る方法を教えています。これらのモデルは、巨大な数学のレシピだと考えてください。モデルは、演算(私たちはこれをレイヤーと呼びます)と、重みと呼ばれる膨大な数の集まりで構成されています。
UltralyticsのYOLOモデルは、画像を本来の姿である数値の配列として処理します。各ピクセルは、画像を構成する一つひとつの点におけるRed、Green、Blueの色の値(つまり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つの巨大な変換層があります(実際にはもっとありますが、Digital Content Managerによると、私の文字数はすでに彼女を不安にさせているそうです)。この驚くべき旅を説明しましょう。
Layer 1: Python → Bytecode まず、Pythonがコードを読み取り、バイトコードと呼ばれるものにコンパイルします。これはコンピューターが処理しやすい中間言語ですが、読もうとすると目が痛くなるほど難解です。
Layer 2: Bytecode → Machine Code Pythonインタープリター(CPythonなど)がバイトコードを受け取り、プロセッサーが理解する実際の命令であるマシンコードに変換します。ここで、洗練された「if x == 1」が、「レジスターをLOADし、レジスターをCOMPAREし、ゼロフラグが設定されていればJUMP」のようなものになります。
Layer 3: Machine Code → Microcode ここで意外な展開です。最新のプロセッサーは、マシンコードを直接実行することさえありません。マシンコードをさらに細かくマイクロコードへ分解します。マイクロコードは、チップの内部コンポーネントが処理できる、さらに小さな演算です。1つの「ADD」命令が複数のマイクロオペレーションになることもあります。
Layer 4: Microcode → Physical Electronics 最後にシリコンへ到達します。これらのマイクロオペレーションが、トランジスターを流れる実際の電気信号を発生させます。何十億個もの小さなスイッチがオンとオフを切り替え、電子が慎重に設計された経路を駆け巡り、どういうわけか魔法のように1 + 1が2になります。
各層は、その下の層にある非常識な複雑さを隠すために存在します。ロシアの入れ子人形のようなものですが、人形ごとにまったく異なる言語を話し、一番小さな人形は文字どおり砂に閉じ込められた稲妻でできています。
皮肉なことに、Pythonの3行が何百万個ものトランジスタスイッチを切り替えている可能性があります。しかし、こうした抽象化のおかげで、そのことを考える必要はありません。単に「y = x + 1」と書き、シリコンの奥深くで魔法が起きると信じればよいのです。
アーキテクチャ#
すべての演算はシリコン上に物理的に実装されており、チップ上のどこで実行されるかは、チップのトポロジーに完全に依存します。電子のための都市計画のようなものです。加算器はここ、乗算器はそこにあり、それらすべてが効率的に通信する必要があります。
市場には、異なる目的向けに設計された何百種類ものチップがあります。チップ間で何が変わるのでしょうか。トポロジー、つまり物理領域における演算の配置と実装方法です。これをアーキテクチャと呼びますが、実に多くの種類があります。
- x86(IntelおよびAMD)- デスクトップコンピューティングの祖。複雑ですが高性能です
- ARM - スマートフォンを動かし、ノートパソコンにもますます採用されています。効率性を重視して設計されています
- RISC-V - オープンソースの反逆者。あらゆる場所で普及が進んでいます
- PowerPC - IBMの強力なプロセッサー。現在もゲームコンソールやサーバーで稼働しています
- MIPS - 学術分野で好まれる、シンプルで洗練されたアーキテクチャです
- SPARC - Sun Microsystems(現在はOracle)の高性能コンピューティングへの貢献です
- GPU architectures(NVIDIAのCUDAコア、AMDのRDNA)- 並列処理の怪物です
各アーキテクチャはトランジスターの配置が異なるだけでなく、異なる言語も話します。これらのマシンに命令を送るために使用する抽象化は、完全に異なります。相手の車に応じて、フランス語や標準中国語、あるいはコンテンポラリーダンスで旅行の道順を書かなければならないようなものです。
シリコンの鼓動#
チップの燃料は電子、つまりチップに流れ込み、計算のエネルギーを供給する電気です。しかし、エネルギーだけでは十分ではありません。チップが実際に動作し、複雑なトポロジーを通じてデータを移動させるには、すべてが1つの重要なコンポーネント、クロックに依存します。クロックによって、電子が特定の経路を特定のタイミングで流れます。これがなければ、電力が供給されているだけで何もしないシリコンになってしまいます。
何十億個ものコンポーネントを完璧に同期させて動かす、大規模なパフォーマンスを調整するところを想像してください。ビートがなければ、混乱してしまいます。プロセッサーにとって、クロックはまさにその役割を果たします。クロックは非常に安定した速度で振動する水晶振動子で、毎秒何十億回も電気パルスを送出します。
「3.5 GHzプロセッサー」と聞いたとき、GHz(ギガヘルツ)はクロック速度を表し、毎秒35億回のビートを意味します。各ビートはクロックサイクルと呼ばれ、コンピューティングにおける時間の基本単位です。
クロックサイクルの間には何も起こりません。コンピューター全体が停止し、次のビートを待ちます。宇宙で最も極端な「だるまさんがころんだ」のようなものです。それぞれの「青信号」(クロックパルス)で、次のことが起こります。
- コンポーネント間でデータが移動します
- 計算が実行されます
- 論理的な判断が行われます
- メモリーの読み書きが行われます
単純な加算のように1サイクルで完了する演算もあれば、除算やRAMからのデータ取得のように多くのサイクルを要する演算もあります。何十億個ものコンポーネントがそれぞれの演算を実行し、すべてがこの絶え間ないビートに同期するよう、正確に振り付けられています。
水晶振動子をより速く振動させれば、プロセッサーをオーバークロックできます。すべてが高速になりますが、発熱も増え、安定性が低下します。限界を超えると、電子がビートについていけなくなり、コンピューターがクラッシュします。
昔は、こうした演算が部屋ほどの大きさの機械で実装されていました。しかし、これらすべての計算を行うコンポーネントは驚くほど単純です。スイッチにすぎません。オンとオフを切り替えるスイッチです。
こうしたスイッチを正しいパターンで十分に接続すれば、計算ができるようになります。デジタル革命全体は、洗練されたスイッチの配置に行き着きます。
この単純さは、スイッチさえあれば、どんなスイッチでもコンピューターを構築できることを意味します。水道管とバルブ、ドミノ、LEGOブロック、ビー玉、さらにはMinecraftのレッドストーンから、実際に動作するコンピューターを作った人々もいます。
原理は1940年代から変わっていません。私たちはスイッチを極めて小さく作ることに非常に長けるようになっただけです。スマートフォンは、人類を月へ送ったすべてのコンピューターを合わせたものより高い計算能力を持ちます。それがポケットに収まるのは、原子スケールでスイッチを作る方法を解明したからです。
数百万個のパラメーターを持つニューラルネットワークを実行するとき、私たちはこの小さなスイッチを毎秒何十億回も切り替え、すべてを水晶の鼓動に完璧に同期させています。すべての重み更新、すべての行列乗算、すべての活性化関数が、クロックのビートに合わせて進みます。
モデルのトレーニングで、コンピューターがまるで離陸しようとしているような音を立てるのも無理はありません。
ニューラルネットワークをBRRRRRと高速化する#
さて、水晶のビートに合わせて何十億個ものスイッチが踊るチップがあり、その上で数百万個のパラメーターを持つニューラルネットワークを実行したいとします。簡単そうですよね。数値をチップに投げ込み、思い切り実行させればよいのです。
ニューラルネットワークを高速に実行するのは、冷蔵庫が3ブロック先にあり、フライパンが1つしかなく、すべての食材が約225kgあるキッチンで、5品のコース料理を作ろうとするようなものです。数学そのものが最大の問題なのではありません。それ以外のすべてが問題なのです。
アーキテクチャの不一致#
ほとんどのチップは、ニューラルネットワークではなくMicrosoft Wordを実行するために設計されています。CPUは、if文やループを実行し、ときどき税金を計算する(スーパーコンピューターでさえ精神的に疲弊する唯一の計算です)ことを想定して作られています。CPUは、これを実行し、次にあれを実行し、その次に別の処理をするという、逐次的な演算向けに最適化されています。
しかし、ニューラルネットワークはまったく異なります。ニューラルネットワークは、すべてを同時に実行したいのです。トレーニング中は、予測がどれだけ間違っていたかに基づいて、数百万個の重みを更新します。推論(トレーニング済みモデルを実際に使用すること)では、数百万回の計算を同時に通してデータを処理します。100万個の数値に別の100万個の数値を掛ける必要があると想像してください。CPUは、心優しくはありますが、非常に高速で几帳面な会計士のように、1つずつ処理したがります。
これが、GPUがAIコンピューティングの中核になった理由です。GPUは、数百万個のピクセルの色を同時に計算する必要があるビデオゲーム向けに設計されました。ピクセルの色の計算とニューラルネットワークの計算は、驚くほど似ていることがわかりました。どちらも大量のデータに対して同じ演算を並列に実行するからです。
しかし、GPUでさえニューラルネットワークに最適とは限りません。そこで現在、企業は専用AIチップ(TPU、NPU、およびPUで終わるその他すべての略語)を構築しています。これらのチップは、ニューラルネットワークを高速化するという1つの仕事のために、ゼロから設計されています。1つの料理しか知らないものの、それを超人的な速さで作るシェフを雇うようなものです。CPUが行列演算を逐次的に処理するのに苦労し、GPUが並列でかなりうまく処理する一方、これらの専用チップは朝食、昼食、夕食のすべてで行列を食べ尽くします。
メモリーの壁(つまり、ビットの移動が数学より難しい理由)#
最新のニューラルネットワーク計算では、データを実際に計算するよりも、データを移動することに多くの時間とエネルギーを費やしています。
コンピューターチップを、光の速さで働く非常に優秀な数学者にたとえてみましょう。ただし、その参考書はすべて街のあちこちにある別々の建物に保管されています。どんな方程式でも瞬時に解けますが、まず数値を取りに行く必要があり、その移動に永遠とも思える時間がかかります。
チップは2つの数値を1クロックサイクルで掛け合わせられます(毎秒何十億回も発生するビートの1つです)。非常に高速です。しかし、メモリーからチップへその数値を取得するには、数百サイクルかかることがあります。数学者が1秒で問題を解ける一方、図書館まで歩いて戻るのに5分かかるようなものです。
その理由は距離(と空間)です。電気は高速で移動しますが、無限に速いわけではありません。チップ上でデータが移動する距離が遠いほど、時間がかかります。コンピューター設計者は、異なる距離に複数のストレージ場所を設ける、複数階層のメモリーを作ることでこの問題を解決しました。
- Registers(演算ユニットに直接組み込まれています):数学者の机です。瞬時にアクセスできます。しかし非常に小さく、ここに保持できるのは約32個の数値だけです。目の前に付箋を置いているようなものです。
- L1 Cache(数マイクロメートル離れています):オフィスの本棚です。何かを取り出すのに3~4サイクルかかります。ここには数千個の数値を格納できます。
- L2 Cache(数ミリメートル離れています):廊下の先にあるファイリングキャビネットです。10~15サイクルかかり、数百万個の数値を格納できます。
- L3 Cache(チップの反対側にあります):階下の倉庫です。30~50サイクルかかり、数千万個の数値を保持できます。
- RAM(完全に別のチップ上にあります):街の向こうにある倉庫です。100~300サイクルかかります。ここに何十億個もの数値が保存されています。
- SSD/Hard Drive(ケーブルで接続されています):まったく別の都市です。数百万サイクルかかります。大容量ですが、速度は氷河のように遅いです。
正確な構造はさまざまです。スマートフォンのチップではL3 Cacheを省略する場合がありますが、サーバーCPUには大量のL3 Cacheが搭載されていることがあります。しかし原則は同じです。近いメモリーほど高速ですが、容量は小さくなります。
ここで、ニューラルネットワークにとって痛ましい問題が生じます。UltralyticsのYOLOモデルに5,000万個のパラメーターがあると想像してください(ちなみにChatGPTには数十億個あります)。それは、メモリーから演算ユニットへ、そして戻るために移動する必要がある5,000万個の数値です。各数値がわずか4バイトだとしても、システム内を移動させる必要があるデータは200メガバイトになります。
チップは各数値を1サイクルで処理できるかもしれません。しかし、RAMからその数値を取得するのに100サイクルかかるなら、時間の99%をデータの到着待ちに費やすことになります。渋滞に巻き込まれたF1レーシングカーのようなものです。これほどの計算能力がありながら、データの到着を待って停止しています。
ここで重要な洞察があります。これこそが最新のコンピューティングにおける最大のボトルネックです。これはフォン・ノイマン・ボトルネックと呼ばれます。数学の処理をチップ上で高速化するのは比較的簡単です。メモリーを高速化することは、物理的な限界に近づいています。そのため、AIにおけるほぼすべてのパフォーマンス最適化は、メモリーレベルで行われます。エンジニアがニューラルネットワークを高速化するとき、数学そのものを高速化することはほとんどありません。データの移動量を減らし、キャッシュをより適切に利用し、より賢くアクセスする方法を見つけているのです。
最新のAIチップは、計算速度だけに注力しているのではありません。メモリーバンド幅とデータ移動戦略を徹底的に重視しています。データを先読みし、キャッシュ内の既存の値を再利用し、メモリーへの往復を最小限に抑えるよう計算を整理します。AIハードウェア競争の勝者は、最も高速な計算機を持つ企業ではありません。計算機にデータを供給し続ける方法を見つけた企業です。ゲームのすべては、メモリーアクセスパターンの最適化にかかっています。
データを1ビット移動させるたびに、エネルギーを消費します。大した量ではなく、ピコジュール単位です。しかし、毎秒テラバイトを移動させると、すぐに積み重なります。実際、チップ上でデータを1mm移動させるほうが、実際の計算を行うよりも多くのエネルギーを使います。
これが、ニューラルネットワークのトレーニング中にノートパソコンがジェットエンジンのような音を立てる理由です。熱を発生させているのは数学ではなく、データ移動です。すべてのパラメーター更新、すべての勾配計算、すべてのフォワードパスが、文字どおり部屋を暖めています。
最新のAIアクセラレーターは、基本的に熱力学の実験です。チップが溶ける前に、どれだけの計算を詰め込めるでしょうか。どれだけ速く熱を逃がせるでしょうか。オーバークロックに似ていますが、クロックは常に11まで上がっており、私たちはただ火事を起こさないようにしているだけです。
解決策は、アーキテクチャを考慮した設計です#
最速のニューラルネットワークが、必ずしも最も賢いとは限りません。チップを念頭に置いて設計されたネットワークこそが高速です。そうしたネットワークは、次のことを行います。
- 可能な限りデータをローカルに保持します
- 計算を徹底的に再利用します
- ハードウェアの能力に完全に適合させます
- どんな犠牲を払ってもメモリー移動を最小限に抑えます
「地元の食料品店で食材を買う」と書かれたレシピと、チベットからスパイスを輸入し、フランスからチーズを取り寄せ、南極から水を運ぶ必要があるレシピの違いのようなものです。どちらもおいしいかもしれませんが、確実に実用的なのは一方です。
これが、ニューラルネットワークを高速化することが芸術になる理由です。優れた数学だけでは十分ではありません。ハードウェアを理解し、メモリー階層を尊重し、アーキテクチャと完璧に調和する必要があります。
コンピューターサイエンスと物理学、エンジニアリング、そして純粋な魔法が出会う世界へようこそ。数値を計算するよりも、数値を移動させるほうがコストが高い世界です。並列処理は高速ですが、同期は致命的です。最大の敵は複雑さではなく、距離です。
YOLOを高速化する方法#
YOLOモデルをトレーニングすると、トレーニング環境では美しく動作するニューラルネットワークが得られます。しかし、ゲーミングGPU、iPhone、そして防犯カメラ内の小さなチップは、まったく異なる言語を話します。それぞれ強みも弱みも異なり、データ処理方法についてもまったく異なる考え方を持っています。
このように考えてみてください。GPUには同時に動作できる数千個のコアがあり、並列処理向けに構築されています。一方、モバイルチップにはAI演算専用に設計された回路が搭載されている場合がありますが、処理できる数学の種類は限られます。そしてドアベルカメラ内のエッジデバイスは、LED電球よりも小さな電力予算でAIを実行しようとしています。
Ultralyticsでは、12種類を超える異なるエクスポート形式をサポートしています。各形式が異なるハードウェア向けに最適化されているためです。選択肢が多すぎることが目的なのではありません。あなた固有のニーズに合った選択肢を用意することが目的です。
演算の融合:より少ないリソースでより多くを実行する#
元のYOLOモデルでは、多くの演算が順番に実行されます。たとえば、畳み込みを行い、結果を正規化し、その後で活性化関数を適用します。これは3つの別々のステップであり、それぞれにメモリーの読み取りと書き込みが必要です。
しかし、ここに巧妙なポイントがあります。これらの演算を1つのステップにまとめられます。YOLOをデプロイ用にエクスポートするとき、これらの演算を融合します。次のように処理する代わりに、
- 畳み込みを計算 → メモリーに保存
- メモリーから読み込み → 正規化 → メモリーに保存
- メモリーから読み込み → 活性化を適用 → メモリーに保存
次のように処理します。
- 畳み込み + 正規化 + 活性化を計算 → メモリーに保存
640×640画像を処理する一般的なYOLOモデルでは、この単純な工夫により、不要なメモリー転送をギガバイト単位で削減できます。携帯電話では、これが滑らかなリアルタイム検出と、ストレスを感じるほどの遅延との違いになります。
より小さな数値を使用する:量子化の魔法#
YOLOは、物体を正確に検出するために、実際には極めて精密な数値を必要としません。トレーニングでは、各重みを表現するために32ビットを使用します。これは、サンドイッチの材料を測るのに関数電卓を使うようなものです。実際にデプロイする場合は、8ビットで十分に機能します。
これは量子化と呼ばれ、最も強力な最適化手法の一つです。より小さな数値を使用することで、次のような効果が得られます。
- モデルサイズが75%縮小します(Ultralytics YOLO11xでは200MBから50MB)。
- ほとんどのデバイスで2~4倍高速に動作します。
- 消費電力を大幅に削減できます(スマートフォンのバッテリーにも優しい設計です)。
YOLOのすべてのレイヤーが、この削減に対して同じように敏感なわけではありません。基本的なエッジや形状を検出する初期レイヤーは、非常に堅牢です。そのため、8ビットの数値を問題なく使用できます。一方、「これは猫か犬か」を判断する最終検出レイヤーには、もう少し高い精度が必要です。そこで、レイヤーごとに精度を調整し、精度を維持するのに十分なビット数だけを使用しながら、速度を最大化します。
慎重に量子化を行うことで、Ultralytics YOLOは元の精度の99.5%を維持しながら、スマートフォン上で3倍高速に動作することが分かっています。これが、研究用モデルと、実際の現場で使用できるモデルの違いです。
最適なアルゴリズムの選択#
同じ数学的演算を実行する方法は数十種類あります。単純な畳み込み(YOLOの中核となる演算)も、まったく異なるアルゴリズムで計算でき、最適な選択は使用するハードウェアと入力サイズによって異なります。
YOLOをエクスポートする際、当社の最適化フレームワークは実際に異なるアルゴリズムをテストし、特定のケースに最も高速なものを選択します。これは、同じ目的地へ向かう複数のルートから、現在の交通状況に基づいて選ぶようなものです。GPUでは、多数のピクセルを同時に処理するアルゴリズムを使用する場合があります。CPUでは、逐次処理向けに最適化されたアルゴリズムを使用する場合があります。数学的な処理は同じでも、実行戦略はまったく異なります。
メモリ:隠れたボトルネック#
現代のコンピューティングでは、メモリが本当のボトルネックだと説明したことを覚えていますか。これはYOLOに特に当てはまります。モデルには5000万個のパラメーターが含まれる場合があり、推論中にはギガバイト単位の中間結果が生成されます。こうした大量のデータを移動する処理は、実際の計算より遅くなることがよくあります。
メモリの移動を最小限に抑えるため、いくつかの工夫を使用しています。
スマートスケジューリング:データが高速なキャッシュメモリにある間にすぐ使用されるよう、演算を配置します。YOLOの特徴ピラミッドネットワークでは、これによりメモリトラフィックを40%削減できます。
タイリング:画像全体を一度に処理するのではなく、キャッシュに収まる小さなタイルに分割します。これにより、プロセッサーは低速なメインメモリから常にデータを取得するのではなく、高速なローカルメモリを使用できます。
バッファーの再利用:中間結果用の新しいメモリを常に作成するのではなく、同じメモリバッファーを再利用します。これは非常に効率的で、YOLOのバックボーン全体を、再利用可能なバッファー群だけで実行できます。
プルーニング:少ないほど効果的#
驚くべき事実があります。YOLOモデルは、過剰に設計されていることがよくあります。多くのレイヤーでチャンネルの30%を削除しても、精度にはほとんど影響がありません。これは単にモデルを小さくするだけではなく、実行する計算そのものが文字どおり少なくなるため、高速化にもつながります。
そのプロセスは洗練されています。まず、最終的な検出結果への寄与が最も小さいネットワークの部分を分析して削除し、その後、影響を補うためにモデルをファインチューニングします。プルーニングしたYOLO11mモデルは、元の精度の99%を維持しながら30%高速化できます。バッテリー駆動のデバイスでは、この効率向上によって稼働時間を数時間延ばせる場合があります。
ハードウェアアクセラレーション:各チップの強みを生かす#
プロセッサーごとに得意な処理は異なり、性能差は驚くほど大きくなります。同じYOLO11nモデルでも、次の時間がかかります。
- 最新のIntel CPUでは1フレームあたり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日実行する必要がある監視カメラを想像してください。そこには厳しい制約があります。
- メモリ:合計で512MB~2GBのRAMしかない場合があります。
- 電力:多くの場合、わずか2~5ワットです(スマートフォンの充電器より少ない電力です)。
- 冷却:ファンはなく、パッシブな放熱のみです。
- 信頼性:クラッシュせずに継続的に動作する必要があります。
最適化によって実際に得られる効果を見てみましょう。YOLO11sを実行する監視カメラの場合です。
- 元のモデル:15ワット、85°Cまで高温化、20 FPSを達成
- 量子化とプルーニングによる最適化後:3ワット、快適な45°C、25 FPSを達成
消費電力を80%削減しながら、実際に性能も向上しました。これが、過熱してバッテリーを消耗するデバイスと、何年にもわたって安定して動作するデバイスの違いです。
重要なのは、適切なトレードオフを選択することです。エッジデバイスでは、次のような対応を行うことがよくあります。
- INT8量子化を使用する(精度を下げ、消費電力を大幅に削減する)
- アクティビティが低い場合は、処理するフレーム数を減らす
- 異なるプロセッサーに処理を分散して、熱を管理する
- モデル全体を高速メモリに収められるサイズに維持する
最適化プロセス#
Ultralyticsでは、最適化に体系的なアプローチを採用しています。まず、モデルのプロファイリングを行い、実際にどこで時間が費やされているかを把握します。多くの場合、ボトルネックは予想した場所にあるとは限りません。わずか数個のレイヤーだけで処理時間の80%が費やされている場合や、メモリ転送が計算時間の大部分を占めている場合もあります。
次に、最適化を反復的に適用します。
- 最大のボトルネックから着手する
- 一度に一つの最適化を適用する
- 速度の向上と精度への影響の両方を測定する
- トレードオフの優れた最適化を維持する
- 目標を達成するまで繰り返す
たとえば、スマートフォンにYOLO11mをデプロイする場合です。
- ベースライン:1フレームあたり200ms、モデルサイズ200MB
- 量子化後:1フレームあたり80ms、モデルサイズ50MB
- プルーニング後:1フレームあたり60ms、モデルサイズ35MB
- 演算融合後:1フレームあたり45ms、モデルサイズ35MB
各ステップで、元の精度の99%以上を維持しながら性能が向上します。その結果、ポケットに収まるデバイスでリアルタイム物体検出を実現できます。
未来:ヘテロジニアスコンピューティング#
最新のデバイスは、複数のプロセッサーを連携させて使用する方法をより賢くなっています。スマートフォンにはプロセッサーが一つだけ搭載されているのではなく、それぞれ異なるタスクに特化した複数のプロセッサーがあります。
- カメラセンサーには、前処理を行うISP(画像信号プロセッサー)があります。
- NPU(ニューラルプロセッシングユニット)がYOLOの推論を実行します。
- CPUが複雑なロジックと調整を処理します。
- GPUが画面上に結果を描画します。
YOLO最適化の未来は、これらのプロセッサー間でモデルをインテリジェントに分割することにあります。たとえば、NPUが主要な畳み込みを処理し、CPUが最終的な検出ロジックを実行し、GPUが結果を可視化する、といった構成です。各プロセッサーが最も得意な処理を担当することで、単一のプロセッサーでは実現できない、より効率的なパイプラインを構築できます。
当社では、各プロセッサーの能力だけでなく、プロセッサー間でデータを移動するコストも考慮しながら、利用可能なプロセッサー間でYOLOを分割する最適な方法を自動的に判断する、スマートパーティショニングアルゴリズムを開発しています。
要点#
YOLOモデルの最適化は、単にファイル形式を変換することではありません。最先端のAIを、実際の現場で機能するものへ変えることです。量子化(より小さな数値を使用する)、プルーニング(不要な部分を削除する)、演算融合(処理ステップを結合する)、スマートなメモリ管理などの技術により、精度を維持しながら10~100倍の性能向上を実現します。
驚くべきことに、普遍的な「最適な」最適化は存在しません。電力を無制限に使用できるクラウドサーバーには、バッテリー駆動のドローンとは異なる最適化が必要です。専用AIチップを搭載したスマートフォンには、Raspberry Piとは異なる対応が必要です。そのため、Ultralyticsは非常に多くのエクスポートオプションを提供しています。それぞれが異なるシナリオ向けに最適化されています。
これまで説明したすべての最適化は、コンピュータービジョンをあらゆる場所で利用可能にするという一つの目標に役立ちます。スマートドアベル、ドローンアプリケーション、大規模なクラウドサービスのいずれを構築する場合でも、制約の中でYOLOを動作させるためのツールを提供します。
UltralyticsでYOLOモデルをエクスポートすると、単にファイルを保存しているのではありません。ニューラルネットワークを実用化するための、長年にわたる研究成果を活用しています。最先端のAIモデルを、現実のハードウェア上で、現実の制約のもと、現実の問題を解決できるものへと変えているのです。
それがUltralyticsの取り組みです。AI研究と実用的なデプロイメントの間にあるギャップを埋めています。AIの未来は、単に最高のモデルを持つことではなく、そのモデルを現実の世界で役立つものにすることだからこそ、あらゆる場所でコンピュータービジョンを機能させています。









