はじめに: ネットワークのエッジにおけるディープラーニング
タイニーML リソースを備えたデバイスにディープラーニングをもたらす分野 非常に限定的: 数キロバイトの RAM を搭載したマイクロコントローラー、スマートフォン、IoT センサー、 組み込みデバイス。推論のためにデータをクラウドに送信する代わりに、モデルが実行されます。 デバイス上で直接実行できるため、遅延ゼロ、完全なプライバシー、オフライン操作が提供されます。
課題は、通常は数ギガバイトのメモリを必要とするモデルを数メガバイトに圧縮することです。 またはキロバイトまで、許容可能な精度を維持します。のようなテクニック 量子化, 剪定 e 知識の蒸留 これを可能にします。この記事では、圧縮技術について説明します。 導入フレームワークと実際の使用例。
何を学ぶか
- 組み込みデバイスの制約: メモリ、計算、エネルギー
- 量子化: float32 から int8 以降
- 枝刈り: 不要な重みを削除します。
- 知識の蒸留: 大規模モデルから小規模モデルへの知識の伝達
- TensorFlow Lite と ONNX: エッジ デプロイメント フレームワーク
- プライバシーとオンデバイス推論
- 使用例: ジェスチャ認識、異常検出、キーワード検出
組み込みデバイスの制約
組み込みデバイスは、モデルの実行を不可能にする厳しい制約の下で動作します。 標準的な深層学習:
- メモリ(RAM): 256 KB (マイクロコントローラー) から 4 ~ 8 GB (スマートフォン)。 ResNet-50 モデルには約 100 MB、GPT-2 モデルには約 500 MB が必要です
- コンピューティング (CPU/NPU): 数十 MHz (マイクロコントローラー) から数 GHz (モバイル)。ほとんどの場合、専用の GPU はありません
- エネルギー: ミリワット (バッテリー駆動のセンサー) から数ワット (スマートフォン) まで。推論はエネルギー効率が高くなければなりません
- ストレージ: 数 MB (フラッシュ) からギガバイト (モバイル) まで。モデルは利用可能なストレージに収まる必要があります
エッジ AI が重要な理由
オンデバイス推論には、次のような重要な利点があります。 ゼロレイテンシー (往復なし クラウドへ)、 プライバシー (データがデバイスから流出することはありません)、 信頼性 (インターネット接続なしでも動作します)、 料金 (推論にクラウド費用はかかりません) e スケーラビリティ (数十億のデバイスが同時に推論を実行できます)。
量子化: 数値精度の低下
La 量子化 モデルの重みとアクティベーションを float32 から変換します (32 ビット) からより少ないビットでの表現: int8 (8 ビット)、int4 (4 ビット)、またはバイナリ (1ビット)。これにより、モデルのサイズが削減され、操作としての推論が高速化されます。 整数の場合、浮動小数点の場合よりも効率的です。
ポストトレーニング量子化 (PTQ)
最も単純な量子化: すでにトレーニングされたモデルを取得し、重みを変換します。 再トレーニングは必要ありませんが、精度が若干低下する可能性があります。
量子化対応トレーニング (QAT)
モデルは、前方パス中に量子化をシミュレートすることによってトレーニングされます。これにより、 ネットワークは低下した精度に適応し、通常は PTQ で失われた精度を回復します。
import torch
import torch.quantization as quant
# --- Post-Training Quantization ---
model = load_trained_model()
model.eval()
# Configurazione quantizzazione: int8 per pesi e attivazioni
model.qconfig = quant.get_default_qconfig('fbgemm') # Per x86
# model.qconfig = quant.get_default_qconfig('qnnpack') # Per ARM
# Preparare il modello
model_prepared = quant.prepare(model)
# Calibrazione: passa dati reali per determinare range
with torch.no_grad():
for batch in calibration_loader:
model_prepared(batch)
# Convertire a modello quantizzato
model_quantized = quant.convert(model_prepared)
# Confronto dimensioni
import os
torch.save(model.state_dict(), 'model_fp32.pth')
torch.save(model_quantized.state_dict(), 'model_int8.pth')
size_fp32 = os.path.getsize('model_fp32.pth') / 1e6
size_int8 = os.path.getsize('model_int8.pth') / 1e6
print(f"FP32: {size_fp32:.1f} MB")
print(f"INT8: {size_int8:.1f} MB")
print(f"Compression: {size_fp32/size_int8:.1f}x")
枝刈り: 重要でない重みを削除する
Il 剪定 接続 (重み) または構造全体 (ニューロン、チャネル、 レイヤー)はモデルの出力にはほとんど寄与しません。ニューラルネットワークは通常、 過度にパラメータ化された: 重量の最大 90% をロスなく除去可能 最低限の精度。
- 非構造化枝刈り: 個々の重みを削除します (ゼロに設定します)。圧縮率は高いが、高速化には専用のハードウェアが必要
- 構造化された枝刈り: チャンネル、フィルター、レイヤー全体を削除します。標準ハードウェアと互換性があり、即時リアルアクセラレーション
import torch.nn.utils.prune as prune
model = load_trained_model()
# Pruning non strutturato: rimuovi 50% dei pesi per magnitudine
for name, module in model.named_modules():
if isinstance(module, torch.nn.Conv2d):
prune.l1_unstructured(module, name='weight', amount=0.5)
elif isinstance(module, torch.nn.Linear):
prune.l1_unstructured(module, name='weight', amount=0.3)
# Contare pesi zero (pruned)
total = 0
pruned = 0
for name, param in model.named_parameters():
if 'weight' in name:
total += param.numel()
pruned += (param == 0).sum().item()
print(f"Parametri totali: {total:,}")
print(f"Parametri pruned: {pruned:,} ({100*pruned/total:.1f}%)")
# Rendere il pruning permanente
for name, module in model.named_modules():
if isinstance(module, (torch.nn.Conv2d, torch.nn.Linear)):
prune.remove(module, 'weight')
知識の蒸留: 教師と生徒
La 知識の蒸留 大規模モデルの知識を伝達する (教師)から小さなモデル(生徒)へ。ラベルだけで生徒を訓練するのではなく 正解です。これは、 ソフトな予測 先生の (予測されたクラスだけでなく、出力の完全な確率)。これらのソフトな予測 より豊富な情報が含まれます。たとえば、猫の写真も同様の確率を持ちます。 飛行機のトラとバスに至るまで、この構造は学生を助けます。
TensorFlow Lite: モバイルとエッジへのデプロイメント
TensorFlow Lite および ML モデルをデプロイするためのリファレンス フレームワーク モバイルおよび組み込みデバイス上で。モデルを最適化するコンバーターを提供します (量子化、 融合演算子)と推論用の軽量ランタイム。
import tensorflow as tf
# Convertire modello Keras a TFLite con quantizzazione
model = tf.keras.models.load_model('my_model.h5')
converter = tf.lite.TFLiteConverter.from_keras_model(model)
# Quantizzazione int8 completa
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_data_gen
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8
converter.inference_output_type = tf.int8
tflite_model = converter.convert()
# Salvare modello TFLite
with open('model_quantized.tflite', 'wb') as f:
f.write(tflite_model)
print(f"Modello TFLite: {len(tflite_model)/1024:.0f} KB")
# Inferenza con TFLite
interpreter = tf.lite.Interpreter(model_path='model_quantized.tflite')
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output = interpreter.get_tensor(output_details[0]['index'])
ONNX: フレームワーク間の相互運用性
ONNX (Open Neural Network Exchange) は、次のことを可能にするオープン フォーマットです。 任意のフレームワーク (PyTorch、TensorFlow など) からモデルをエクスポートし、ランタイムで実行します。 最適化されました。 ONNX ランタイム いくつかの自動最適化を提供します ハードウェア プラットフォーム、 TVM モデルを最適化されたネイティブ コードにコンパイルする 特定のデバイス向け。
実際の使用例
- キーワードの発見: 数 KB の RAM を搭載したデバイスで音声コマンド (「Hey Siri」、「OK Google」) を認識します。 >95% の精度を備えた 20 ~ 50 KB モデル
- ジェスチャー認識: IMU センサー (加速度計、ジャイロスコープ) でジェスチャを認識します。スマートウォッチとウェアラブル用のテンプレート
- 異常検出:振動センサーで産業機械の異常を検知。クラウド接続を必要としない予知メンテナンス
- モバイルでの物体検出: スマートフォンでのリアルタイム物体認識のための MobileNet と EfficientDet
- オンデバイスの顔認識:AppleのFace IDは、Aシリーズチップの専用ニューラルモデルを使用しています
シリーズの次のステップ
- 前回の記事では、説明可能な AI (XAI)
- SHAP、LIME、GradCAMを使用してモデルの決定を解釈する方法を見ていきます。
- モデルの透明性が GDPR 準拠と公平性にとって重要である理由を分析します







