Ray を使用して効率的な深層学習データ パイプラインを作成する
ディープ ラーニング モデルのトレーニングに必要な GPU は強力ですが、高価です。 GPU を最大限に活用するには、開発者は、次のトレーニング ステップを計算する準備ができたときに GPU にデータを迅速に転送できる効率的なデータ転送チャネルが必要です。 Ray を使用すると、データ送信チャネルの効率を大幅に向上させることができます。
1. トレーニング データ パイプラインの構造
最初に、モデル トレーニングの疑似コードを見てみましょう
for step in range(num_steps):sample, target = next(dataset) # 步骤1train_step(sample, target) # 步骤2
ステップ 1 では、次のミニバッチのサンプルとラベルを取得します。ステップ 2 では、それらが train_step 関数に渡され、関数がそれらを GPU にコピーし、前方パスと後方パスを実行して損失と勾配を計算し、オプティマイザーの重みを更新します。
ステップ 1 について詳しくは、こちらをご覧ください。データ セットが大きすぎてメモリに収まらない場合、ステップ 1 で次のミニバッチがディスクまたはネットワークからフェッチされます。さらに、ステップ 1 には、ある程度の前処理も含まれます。入力データは、モデルに供給される前に、数値テンソルまたはテンソルのコレクションに変換する必要があります。場合によっては、モデルに渡される前に、正規化、軸を中心とした回転、ランダム シャッフルなどの他の変換もテンソルに対して実行されます。
ワークフローが厳密に順番に実行される場合、つまり、最初にステップ 1 を実行し、次にステップ 2 を実行する場合、モデルは常にデータの入力、出力、および前処理操作の次のバッチを待機する必要があります。 GPU は効率的に利用されず、次のデータのミニバッチをロードしている間はアイドル状態になります。
この問題を解決するには、データ パイプラインを生産者と消費者の問題として見ることができます。データ パイプラインはデータの小さなバッチを生成し、それらを境界付きバッファーに書き込みます。モデル/GPU はバッファーからのデータの小さなバッチを消費し、順方向/逆方向の計算を実行し、モデルの重みを更新します。データ パイプラインがモデル/GPU の消費と同じくらい早くデータの小さなバッチを生成できる場合、トレーニング プロセスは非常に効率的になります。
図
2. Tensorflow tf.data API
Tensorflow tf.data API は、使用できる豊富な関数セットを提供します。データ パイプラインを効率的に作成し、バックグラウンド スレッドを使用してデータの小さなバッチを取得することで、モデルが待機する必要がなくなります。データをプリフェッチするだけでは不十分です。小さなデータ バッチの生成が GPU がデータを消費できるよりも遅い場合は、並列化を使用してデータの読み取りと変換を高速化する必要があります。この目的を達成するために、Tensorflow は、複数のスレッドを利用してデータを並列に読み取るインターリーブ機能と、複数のスレッドを使用してデータの小さなバッチを変換する並列マッピング機能を提供します。
これらの API はマルチスレッドに基づいているため、Python Global Interpreter Lock (GIL) によって制限される可能性があります。 Python の GIL は、バイトコードを一度に実行できるスレッドを 1 つだけに制限します。パイプラインで純粋な TensorFlow コードを使用する場合、TensorFlow コア実行エンジンは GIL の範囲外で動作するため、通常はこの制限の影響を受けません。ただし、使用されているサードパーティ ライブラリが GIL 制限を解除していない場合、または Python を使用して多数の計算を実行している場合、マルチスレッドに依存してパイプラインを並列化することは現実的ではありません
3. マルチプロセスを使用します。データ パイプラインの並列化
データ サンプルとラベルのミニバッチを生成するためのいくつかの計算のロードと実行をシミュレートする次のジェネレーター関数を考えてみましょう。
def data_generator():for _ in range(10):# 模拟获取# 从磁盘/网络time.sleep(0.5)# 模拟计算for _ in range(10000):passyield (np.random.random((4, 1000000, 3)).astype(np.float32), np.random.random((4, 1)).astype(np.float32))
次に、ダミー トレーニング パイプラインでジェネレーターを使用し、データのミニバッチの生成にかかる平均時間を測定します。
generator_dataset = tf.data.Dataset.from_generator(data_generator,output_types=(tf.float64, tf.float64),output_shapes=((4, 1000000, 3), (4, 1))).prefetch(tf.data.experimental.AUTOTUNE)st = time.perf_counter()times = []for _ in generator_dataset:en = time.perf_counter()times.append(en - st)# 模拟训练步骤time.sleep(0.1)st = time.perf_counter()print(np.mean(times))
平均所要時間は約 0.57 秒であることが観察されました (Intel Core i7 プロセッサを搭載した Mac ラップトップで測定)。これが実際のトレーニング ループである場合、GPU 使用率は非常に低くなり、計算に費やすのは 0.1 秒のみで、その後、次のデータ バッチを待機する 0.57 秒間アイドル状態になります。
データの読み込みを高速化するために、マルチプロセス ジェネレーターを使用できます。
from multiprocessing import Queue, cpu_count, Processdef mp_data_generator():def producer(q):for _ in range(10):# 模拟获取# 从磁盘/网络time.sleep(0.5)# 模拟计算for _ in range(10000000):passq.put((np.random.random((4, 1000000, 3)).astype(np.float32),np.random.random((4, 1)).astype(np.float32)))q.put("DONE")queue = Queue(cpu_count()*2)num_parallel_processes = cpu_count()producers = []for _ in range(num_parallel_processes):p = Process(target=producer, args=(queue,))p.start()producers.append(p)done_counts = 0while done_counts <p>ここで、次のデータのミニバッチを待機するのにかかる時間を測定すると、平均時間は 0.08 秒になります。ほぼ 7 倍速くなりますが、理想的にはこの時間を 0 に近づけたいと考えています。 </p><p>これを分析すると、データの逆シリアル化の準備に多くの時間が費やされていることがわかります。マルチプロセス ジェネレーターでは、プロデューサー プロセスは大きな NumPy 配列を返します。これは、メイン プロセスで準備してから逆シリアル化する必要があります。では、プロセス間で大きな配列を渡すときの効率を向上させるにはどうすればよいでしょうか? </p><h2 id="Ray-を使用してデータ-パイプラインを並列化する">4. Ray を使用してデータ パイプラインを並列化する</h2><p>ここで Ray が活躍します。 Ray は、Python で分散コンピューティングを実行するためのフレームワークです。異なるプロセス間でオブジェクトを効率的に転送するための共有メモリ オブジェクト ストアが付属しています。特に、オブジェクト ストア内の Numpy 配列は、シリアル化や逆シリアル化を行わずに、同じノード上のワーカー間で共有できます。また、Ray を使用すると、複数のマシンにまたがるデータの読み込みを簡単に拡張でき、Apache Arrow を使用して大規模な配列を効率的にシリアル化および逆シリアル化することもできます。 </p><p>Ray には、並列反復子を作成できるユーティリティ関数 from_iterators が付属しており、開発者はそれを使用して data_generator ジェネレーター関数をラップできます。 </p><pre class="brush:php;toolbar:false">import raydef ray_generator():num_parallel_processes = cpu_count()return ray.util.iter.from_iterators([data_generator]*num_parallel_processes).gather_async()
ray_generator を使用すると、次のデータのミニバッチの待機に費やされる測定時間は 0.02 秒で、これはマルチプロセス処理を使用する場合より 4 倍高速です。
以上がRay を使用して効率的な深層学習データ パイプラインを作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









BERT は、2018 年に Google によって提案された事前トレーニング済みの深層学習言語モデルです。正式名は BidirectionEncoderRepresentationsfromTransformers で、Transformer アーキテクチャに基づいており、双方向エンコードの特性を備えています。従来の一方向コーディング モデルと比較して、BERT はテキストを処理するときにコンテキスト情報を同時に考慮できるため、自然言語処理タスクで優れたパフォーマンスを発揮します。その双方向性により、BERT は文内の意味関係をより深く理解できるようになり、それによってモデルの表現能力が向上します。事前トレーニングおよび微調整方法を通じて、BERT は感情分析、命名などのさまざまな自然言語処理タスクに使用できます。

活性化関数は深層学習において重要な役割を果たしており、ニューラル ネットワークに非線形特性を導入することで、ネットワークが複雑な入出力関係をより適切に学習し、シミュレートできるようになります。活性化関数の正しい選択と使用は、ニューラル ネットワークのパフォーマンスとトレーニング結果に重要な影響を与えます。この記事では、よく使用される 4 つの活性化関数 (Sigmoid、Tanh、ReLU、Softmax) について、導入、使用シナリオ、利点、欠点と最適化ソリューション アクティベーション関数を包括的に理解できるように、次元について説明します。 1. シグモイド関数 シグモイド関数の公式の概要: シグモイド関数は、任意の実数を 0 と 1 の間にマッピングできる一般的に使用される非線形関数です。通常は統一するために使用されます。

以前に書きましたが、今日は、深層学習テクノロジーが複雑な環境におけるビジョンベースの SLAM (同時ローカリゼーションとマッピング) のパフォーマンスをどのように向上させることができるかについて説明します。ここでは、深部特徴抽出と深度マッチング手法を組み合わせることで、低照度条件、動的照明、テクスチャの弱い領域、激しいセックスなどの困難なシナリオでの適応を改善するように設計された多用途のハイブリッド ビジュアル SLAM システムを紹介します。当社のシステムは、拡張単眼、ステレオ、単眼慣性、ステレオ慣性構成を含む複数のモードをサポートしています。さらに、他の研究にインスピレーションを与えるために、ビジュアル SLAM と深層学習手法を組み合わせる方法も分析します。公開データセットと自己サンプリングデータに関する広範な実験を通じて、測位精度と追跡堅牢性の点で SL-SLAM の優位性を実証しました。

潜在空間埋め込み (LatentSpaceEmbedding) は、高次元データを低次元空間にマッピングするプロセスです。機械学習と深層学習の分野では、潜在空間埋め込みは通常、高次元の入力データを低次元のベクトル表現のセットにマッピングするニューラル ネットワーク モデルです。このベクトルのセットは、「潜在ベクトル」または「潜在ベクトル」と呼ばれることがよくあります。エンコーディング」。潜在空間埋め込みの目的は、データ内の重要な特徴をキャプチャし、それらをより簡潔でわかりやすい形式で表現することです。潜在空間埋め込みを通じて、低次元空間でデータの視覚化、分類、クラスタリングなどの操作を実行し、データをよりよく理解して活用できます。潜在空間埋め込みは、画像生成、特徴抽出、次元削減など、多くの分野で幅広い用途があります。潜在空間埋め込みがメイン

今日の急速な技術変化の波の中で、人工知能 (AI)、機械学習 (ML)、および深層学習 (DL) は輝かしい星のようなもので、情報技術の新しい波をリードしています。これら 3 つの単語は、さまざまな最先端の議論や実践で頻繁に登場しますが、この分野に慣れていない多くの探検家にとって、その具体的な意味や内部のつながりはまだ謎に包まれているかもしれません。そこで、まずはこの写真を見てみましょう。ディープラーニング、機械学習、人工知能の間には密接な相関関係があり、進歩的な関係があることがわかります。ディープラーニングは機械学習の特定の分野であり、機械学習

1. はじめに ベクトル検索は、最新の検索および推奨システムの中核コンポーネントとなっています。テキスト、画像、音声などの複雑なオブジェクトを数値ベクトルに変換し、多次元空間で類似性検索を実行することにより、効率的なクエリ マッチングとレコメンデーションが可能になります。基本から実践まで、Elasticsearch の開発の歴史を確認します。この記事では、各段階の特徴と進歩に焦点を当てて、Elasticsearch ベクトル検索の開発の歴史を振り返ります。歴史をガイドとして考慮すると、Elasticsearch ベクトル検索の全範囲を確立するのは誰にとっても便利です。

2006 年にディープ ラーニングの概念が提案されてから、ほぼ 20 年が経過しました。ディープ ラーニングは、人工知能分野における革命として、多くの影響力のあるアルゴリズムを生み出してきました。では、ディープラーニングのトップ 10 アルゴリズムは何だと思いますか?私の考えでは、ディープ ラーニングのトップ アルゴリズムは次のとおりで、いずれもイノベーション、アプリケーションの価値、影響力の点で重要な位置を占めています。 1. ディープ ニューラル ネットワーク (DNN) の背景: ディープ ニューラル ネットワーク (DNN) は、多層パーセプトロンとも呼ばれ、最も一般的なディープ ラーニング アルゴリズムです。最初に発明されたときは、コンピューティング能力のボトルネックのため疑問視されていました。最近まで長年にわたる計算能力、データの爆発的な増加によって画期的な進歩がもたらされました。 DNN は、複数の隠れ層を含むニューラル ネットワーク モデルです。このモデルでは、各層が入力を次の層に渡し、

エディター | Radish Skin 2021 年の強力な AlphaFold2 のリリース以来、科学者はタンパク質構造予測モデルを使用して、細胞内のさまざまなタンパク質構造をマッピングし、薬剤を発見し、既知のあらゆるタンパク質相互作用の「宇宙地図」を描いてきました。ちょうど今、Google DeepMind が AlphaFold3 モデルをリリースしました。このモデルは、タンパク質、核酸、小分子、イオン、修飾残基を含む複合体の結合構造予測を実行できます。 AlphaFold3 の精度は、これまでの多くの専用ツール (タンパク質-リガンド相互作用、タンパク質-核酸相互作用、抗体-抗原予測) と比較して大幅に向上しました。これは、単一の統合された深層学習フレームワーク内で、次のことを達成できることを示しています。
