Big Data
ビッグデータとは、単一マシンのツールでは処理しきれないほど大規模、高速、または多様なデータです。3つのV、MapReduceとSpark、現代のAIを支えるデータセットを解説します。
ビッグデータとは、サイズ、到着率、または形式の種類が、単一のマシンと従来のデータベースツールで保存・処理できる範囲を超えるデータを指します。そのため、データは並列処理を行うマシンのクラスターに分散されます。META GroupのアナリストDoug Laney氏は、2001年にこの課題を3つのVとして説明しました。データ量を表すボリューム、データの到着速度と処理速度を表すベロシティ、構造化テーブル、ログ、テキスト、画像、音声、動画などの組み合わせを表すバラエティです。その後、データの信頼性を表すベラシティと価値も定義に加わりました。機械学習において、ビッグデータは原材料であると同時にエンジニアリング上の課題でもあります。モデルは訓練データを増やすことで改善し、そのデータを収集、クリーニング、提供するパイプラインの構築には、多くの作業が必要です。
AIとコンピュータービジョンにおけるビッグデータ#
ディープラーニングは、1台のディスクには収まりきらない大規模データセットとともに発展しました。2009年に登場したImageNetには、ラベル付き画像が1,400万枚以上含まれるようになりました。その1,000クラスのチャレンジで使用された訓練画像128万枚によって、2012年のコンペティションで優勝した畳み込みニューラルネットワーク AlexNetが訓練されました。MetaがSegment Anything Modelとともに2023年に公開したSA-1Bデータセットには、画像1,100万枚とセグメンテーションマスク11億個が含まれています。また、MetaはLlama 3を15兆を超えるテキストトークンで事前学習しました。スケーリング則は、このようなデータセットが効果を発揮する理由を説明します。データ、パラメーター、計算量をともに増やすと、損失は予測可能な形で低下します。
コンピュータービジョンにおけるデータ量は、カメラやセンサーの大規模な設置から生じます。自動運転車は、走行するたびに1時間分のカメラ、レーダー、ライダーのデータストリームを記録し、工場や店舗でも数千の連続動画フィードが追加されます。交通や生産ラインの動画に対するリアルタイム推論のように、データの到着に合わせて結果を得る必要がある場合は、ベロシティが重要になります。バラエティには、画像や動画に加え、アノテーション、センサーメタデータ、ログも含まれます。ラベルが正確でなければ、データを増やしても効果はありません。そのため、大規模なビジョンデータセットでは、新たにラベルを付ける価値のある画像を選ぶために、データクリーニング、重複排除、アクティブラーニングが欠かせません。
ビッグデータの保存と処理の方法#
ビッグデータシステムはスケールアウトします。1台の大型サーバーの代わりに、多数の汎用マシンにデータと計算を分散します。Googleが2004年に発表したMapReduceの論文では、このモデルが説明され、オープンソースのApache Hadoopによって広く普及しました。入力をシャードに分割し、各シャードを保存するマシン上でmap関数を並列実行し、部分結果をreduceして1つの答えにまとめます。2009年にUC Berkeleyで開発が始まったApache Sparkは、中間結果をメモリに保持します。そのため、モデル訓練などの反復処理を、ディスクベースのMapReduceより大幅に高速化できます。通常、未加工ファイルはデータレイクとして整理されたクラウドのオブジェクトストレージに置かれます。Apache Parquetなどの列指向フォーマットでは、クエリに必要な列だけを読み取ることができ、Apache Kafkaなどのストリーミングプラットフォームは、高速に到着するイベントを処理します。
この例では、Python標準ライブラリを使い、画像ラベルの3つのシャードに対してmapとreduceのステップを実行します。
from collections import Counter
from multiprocessing import Pool
# # 画像ラベルの3つのシャード。クラスターでは各シャードを別々のマシンに保存します
shards = [
["car", "person", "car", "bus"],
["person", "person", "bicycle"],
["car", "person", "dog", "car"],
]
def count_labels(shard):
"""Map step: count the labels in one shard."""
return Counter(shard)
if __name__ == "__main__":
with Pool(processes=3) as pool:
partial_counts = pool.map(count_labels, shards) # # シャードごとに1つのワーカープロセス
# # Reduceステップ:部分的なカウントを1つの合計にまとめます
totals = sum(partial_counts, Counter())
print(totals.most_common())各シャードはそれぞれ別のプロセスでカウントされ、reduceステップで部分的なカウントを[('car', 4), ('person', 4), ('bus', 1), ('bicycle', 1), ('dog', 1)]にまとめます。SparkとHadoopは同じ2つのステップを数千台のマシンで実行し、各シャードを保持するマシンにmapコードを送ります。
ビッグデータを使ったモデルの訓練#
訓練の実行では、ビッグデータをバッチ単位で読み込みます。データローダーはローカルディスクまたはオブジェクトストレージから、数十枚から数百枚の画像を複数のワーカープロセスでデコードするため、データセット全体をメモリに収める必要はありません。分散訓練では、各バッチを複数のGPUに分割します。物体検出では、GoogleのOpen Images V7検出データセットは561 GBのダウンロードサイズで、601クラスにわたる訓練画像が174万枚含まれており、大半のマシンのRAMに収まる量を大きく超えています。cache="ram"を使ってデータセットをメモリにキャッシュするよう指定すると、Ultralytics YOLOの訓練はランダムに選んだ30枚の画像からデコード後のサイズを推定します。その推定値の2倍が利用可能なRAMに収まる場合に限りキャッシュし、それより大きなデータセットは各エポックでディスクから読み込んでデコードします。










