問題タブ [multi-gpu]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
tensorflow - バケット エラーのあるテンソルフロー
テンソルフローを使用して、シーケンスからシーケンスへのモデルをトレーニングしようとしています。チュートリアルでは、バケットがトレーニングのスピードアップに役立つことがわかりました。これまでのところ、1 つのバケットだけを使用してトレーニングできます。また、1 つの GPU と複数のバケットを使用して、多かれ少なかれすぐに使用できるコードを使用できますが、複数の GPU で複数のバケットを使用しようとすると、無効というエラーが表示されます引数: プレースホルダー テンソル 'gpu_scope_0/encoder50_gpu0' の値を dtype int32 でフィードする必要があります
エラーから、input_feed を正しく宣言していないことがわかります。そのため、入力が毎回最大のバケットのサイズであると想定しています。なぜこれが当てはまるのか、私は混乱しています。なぜなら、私が適応している例では、input_feed のプレースホルダーを初期化するときに同じことを行うからです。私が知る限り、チュートリアルも最大サイズのバケットまで初期化されますが、チュートリアルのコードを使用すると、このエラーは発生しません。
関連する初期化コードは次のとおりです。
以下は、データをフィードする際の関連コードです。
現在、すべての入力をバケットサイズまでパディングすることを検討していますが、これによりバケット化の利点の一部が失われることが予想されます
multithreading - 複数の GPU (2) で OpenCL を同時に実行する方法は?
GPU が 2 つ、カーネルが 1 つ、コンテキストが 1 つ、コマンド キューが 2 つ (GPU ごとに 1 つ) あります。各コマンド キューが実行されるループでそれらを実行しようとしましたが、GPU で同時に作業を実行することを期待して、両方queue.finish()
を試しました。queue.flush()
しかし実際には、データが最初に 1 つのデバイスに送信され、GPU がその作業を実行し、次に別の GPU が作業を開始します。単一の GPU の場合の 2 倍の時間がかかります。これは私が達成しようとしているものではありません!
また、バッファーをホスト コードに読み込んでいますが、2 番目の GPU が 1 番目の GPU の結果を待機することが問題になる可能性があると考える人もいるかもしれません。しかし、私はまた、結果の読み取りをコメントアウトしましたが、運がありませんでした。それはまだ同じです。
私の質問は次のとおりです。真の同時実行性を実現し、他の GPU の結果を待たずに GPU を同時に実行するにはどうすればよいですか? 2 つのコンテキストを作成する必要がありますか? 私は何か他のことをすべきですか?
カーネルが 1 つあることに注意してください
cuda - cuDeviceCanAccessPeer(...) と cuDeviceGetP2PAttribute(..., CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED, ...) の違いは何ですか?
これをテストするためにマルチ GPU システムにアクセスすることはできませんが、cuda.h で非常によく似た 2 つのことを見つけました。まずは機能です
記述
コンテキスト on がコンテキスト on からメモリに直接アクセスできるかどうかの値
*canAccessPeer
を返します。fromへの直接アクセスが可能な場合、 を呼び出すことにより、2 つの特定のコンテキストでアクセスを有効にすることができます。1
dev
peerDev
0
peerDev
dev
::cuCtxEnablePeerAccess()
そして2つ目は
記述
との間のリンク
*value the
の要求された属性の値を返します。サポートされている属性は次のとおりです。attrib
srcDevice
dstDevice
::CU_DEVICE_P2P_ATTRIBUTE_PERFORMANCE_RANK
: 2 つのデバイス間のリンクのパフォーマンスを示す相対値。
::CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED
P2:
1` P2P アクセスが有効な場合。
::CU_DEVICE_P2P_ATTRIBUTE_NATIVE_ATOMIC_SUPPORTED: 1
リンクを介したアトミック操作がサポートされている場合。
名前は、への呼び出しがset toを使用するのと同じでCU_DEVICE_ATTRUBUTE_ACCESS_SUPPORTED
あることを示唆しています が、「 P2P アクセスが有効な場合」という説明は私を混乱させます。cuDeviceCanAccessPeer
cuDeviceGetP2PAttribute
attrib
::CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED P2P
1
それらは本当に同じですか、それとも 2 つ目はリンクがアクティブ化されているかどうかをテストすることになっていますか?
tensorflow - TensorFlow での Tesla K80 のメモリ使用量
Tesla k80 GPU を使用した TensorFlow の畳み込みニューラル ネットワークのサンプル コードを実行しました。
「GPU 1」のメモリ使用量は 11Gb で、最大の 12Gb の約 95% でした。しかし「GPU 2」のメモリ使用量はわずか64Mb。TensorFlow を搭載した Tesla K80 で GPU の両方のメモリを使用する方法を教えてください。
tensorflow - Tensorflow コードで gpu を指定: /gpu:0 は常に機能していますか?
私のワークステーションには 3 つのグラフィックス カードがあり、そのうちの 1 つは Quadro K620 で、残りの 2 つは Titan X です。グラフィック カードの 1 つで tensorflow コードを実行して、他のカードを別のカードのためにアイドル状態にしておくことができるようにしたいと考えています。仕事。
ただし、設定tf.device('/gpu:0')
やに関係なくtf.device('/gpu:1')
、1 番目の Titan X グラフィックス カードが常に動作していることがわかりました。理由はわかりません。
<=== THIS LINE
「 : 」の行について
を設定tf.device('/gpu:0')
すると、モニターには次のように表示されます。
最初の Titan X カードが機能していることを示しています。
を設定tf.device('/gpu:1')
すると、モニターには次のように表示されます。
2 枚目の Titan X だけではなく、2 枚の Titan X カードが機能していることを示しています。
この背後にある理由と、プログラムを実行する gpu を指定する方法はありますか?
tensorflow - 適切に構成されたパラメーター サーバーを使用して SLURM クラスターで Tensorflow を実行する方法は?
私は幸運にも、大学の SLURM を利用した GPU クラスターにアクセスできる立場にあります。Tensorflow をクラスター ノードで実行しようとしてきましたが、これまでのところ、ドキュメントを見つけることができませんでした。(私が大学で話した人は皆、以前は CPU ノードを使用して、または単一の GPU ノードを使用して実行していました。
この前の質問hereから優れたドキュメントを見つけました。残念ながら、かなり不完全です。このような私が見つけた他のすべての分散例は、パラメーターサーバーを明示的に指定することに依存しています。
SO質問のコードを使用して実行しようとすると、存在しないパラメータサーバーへの接続に失敗するか、server.joinが呼び出されてスバッチ出力ファイルに出力が提供されないときにハングするまで、完全に動作しているように見えます(私は起こるべきだと理解しています)。
要するに、私の質問は、SLURM クラスターで Tensorflow を開始するにはどうすればよいかということです。スバッチの段階から。AWS で SPARK 以外の分散コンピューティング フレームワークを扱うのはこれが初めてで、Tensorflow を適切に構成する方法についてもっと学びたいと思っています。サーバーの例として、tf_hostlist 内のどの項目をパラメーター サーバーとして指定するにはどうすればよいですか? あるいは、他の例で見たように、sbatch を使用して各ワーカーにわずかに異なるコマンドを送信できますか?
tensorflow - Tensorflow: Multigpu トレーニングで変数を CPU にピン留めできない
テンソルフローを使用して最初のマルチ GPU モデルをトレーニングしています。チュートリアルが述べているように、変数は name_scope を使用してすべての GPU で CPU と ops に固定されます。
小さなテストを実行してデバイスの配置をログに記録していると、ops が TOWER_1/TOWER_0 プレフィックスでそれぞれの GPU に配置されていることがわかりますが、変数は CPU に配置されていません。
何かが足りないのでしょうか、それともデバイス配置ログを間違って理解したのでしょうか。
テスト コードを添付します。デバイス配置ログは次のとおりです。
ありがとう
テストコード
編集 基本的に、「with slim.arg_scope([tf.contrib.framework.python.ops.variables.variable], device='/cpu:0'):」という行は、CPU 上のすべての変数を強制する必要がありますが、それらは作成されます「gpu:0」で
cuda - cudaEventRecord は現在のデバイスの ID の影響を受けますか?
cudaEventRecordは、イベント ID とストリーム ID をパラメーターとして受け取ります。ランタイム API リファレンスには、ストリームを現在のデバイスに関連付ける必要があるかどうかは記載されていません。現在アクセスできるシステムには GPU が 1 つしかないため、そうであるかどうかをテストすることはできません。
現在のデバイス上のストリームである必要があると仮定します。
- 別のデバイスでストリームを取得するとどうなりますか?
それが任意のデバイスのストリームであると仮定すると、次のようになります。
- (現在のデバイスの) デフォルト ストリームの ID を取得するとどうなりますか? 結局のところ、すべてのデバイスのデフォルト ストリームが同じ (null) ID を持っているのでしょうか?
- ストリームのデバイスが最新であるかどうかに基づいて、動作に違いはありますか?