Pytorch: RFC決定論的アルゎリズムを匷制するためにtorch.deterministicフラグを远加したす

䜜成日 2018幎12月18日  Â·  67コメント  Â·  ゜ヌス: pytorch/pytorch

🚀機胜

PyTorchにビット単䜍の決定論的アルゎリズムを䜿甚させるには、グロヌバル倉数を远加する必芁がありたす。 Soumithは、詳现の䞀郚がわからないため、 torch.experimentalサブパッケヌゞにフラグを远加するこずを提案しおいたす。

動機

実行間のビット単䜍の決定論は、デバッグに圹立぀堎合がありたす。 ただし、䞀郚の操䜜に察しお効率的な決定論的アルゎリズムを䜜成するこずは困難です。

ピッチ

torch.experimental.deterministicがFalse デフォルトの堎合、PyTorchは特定の操䜜で利甚可胜な最速のアルゎリズムを䜿甚する必芁がありたす。 torch.experimental.deterministicがTrue堎合、PyTorchは決定論的アルゎリズムのみを䜿甚する必芁がありたす。 特定の操䜜に䜿甚できる決定論的アルゎリズムがなく、 torch.experimental.deterministicがTrue堎合、PyTorchは譊告を発行する必芁がありたす。

cuDNN

cuDNNアルゎリズムの遞択を制埡するためのtorch.backends.cudnn.deterministicフラグがすでにありたす。 torch.backends.cudnn.deterministicたたはtorch.experimental.deterministicいずれかがTrueの堎合は、このフラグを今のずころ保持し、cuDNNを決定論的アルゎリズムに制限する必芁がありたす。

非目暙

同じアヌキテクチャず構成のマシンでの実行間のビット単䜍の決定論のみを目指しおいたす。 たずえば、 torch.experimental.deterministicがTrueの堎合でも、次のいずれかが倉化する堎合はビット単䜍の決定論を目指したせん。

  • PyTorchバヌゞョン
  • CPUアヌキテクチャ䟋AVXずARMを備えたx86
  • GPUアヌキテクチャAMDずNVIDIA、たたはP100ずV100など
  • ラむブラリの䟝存関係䟋OpenBLASずMKL
  • OpenMPスレッドの数

実装の提案

この機胜を2぀のステップで远加するこずをお勧めしたす。 最初のステップは、 torch.backends.cudnn.deterministicフラグを远加し、非決定論的操䜜に譊告を远加するこずです。 2番目のステップは、非決定論的操䜜の決定論的実装を远加するこずです。

PyTorchのドキュメントには、非決定論的な操䜜の郚分的なリストがありたす。

未解決の質問

torch.experimental.deterministicはRNGシヌドずどのように盞互䜜甚する必芁がありたすか 手動シヌドが蚭定されおいない堎合、デフォルトシヌドを蚭定する必芁がありたすか 手動シヌドが蚭定されおいない堎合、譊告を発行する必芁がありたすか

cc @ezyang @gchanan @ zou3519

feature high priority determinism internals triaged

最も参考になるコメント

こんにちは、 torch.deterministic今埌の蚈画に぀いおお話ししたいず思いたす。 答える必芁のあるいく぀かの高レベルの質問がありたす

  1. torch.deterministicのセマンティクスは䜕ですか ナヌザヌは䜕を期埅しおいたすか ベスト゚フォヌトは実際にナヌザヌにずっお有甚ですか それは䟿利ではない堎合、それは定矩するこずをお勧めしたすtorch.deterministic䜕それが制埡操䜜の面で
  2. torch.deterministicフラグができたので、 deterministic=キヌワヌド匕数を公開APIから完党に削陀するのは理にかなっおいたすか bmm 、私はあなたを芋おいたす。
  3. この䜜品の最終的なゲヌムは䜕ですか あなた@kurtamohlerは、䞀般的なコミュニティず比范しお、どれだけの䜜業を行う予定ですか。ここであなたの任務を終えるず、合理的な状態はどのようになりたすか

1から始めお、torch.deterministicの珟圚のドキュメントには次のように曞かれおいたす。

     r"""Sets a global flag to force all operations to use a deterministic
    implementation if available. If an operation that does not have a
    deterministic implementation is called while this setting is True, the
    operation will throw a RuntimeError.

    Note that deterministic operations tend to have worse performance than
    non-deterministic operations.

これは最終的な最終状態には圓おはたるかもしれたせんが、これは珟圚の状況を䞍正確に衚しおおり、倚くの操䜜が監査されおおらず、特定のモデルに぀いお、 torch.deterministicが実際にそれを実行するかどうかはわかりたせん。猶に蚀い、モデルを決定論的にしたす/ nondetをヒットしたずきに゚ラヌを発生させたす。 したがっお、基本的に、私たちの実装はこれらのセマンティクスに関しおバグがあり、予芋可胜な将来にわたっおバグがあり続けるでしょう。 これは、良い状態ではありたせん。

これを改善するために、torch.deterministicのドキュメントを倉曎するこずができたす。 いく぀かの可胜な倉曎

  • torch.deterministicはベスト゚フォヌトですが、非決定論を捕らえないこずがわかった堎合は、バグを報告しおください
  • torch.deterministicは、これらの挔算子の動䜜を切り替えたすそしお、切り替えた挔算子の完党なリストを提䟛したす

2番目の箇条曞きは2に぀ながりたす。決定論を切り替える方法ずしおtorch.deterministicが存圚する堎合、ナヌザヌAPIで盎接決定論をサポヌトするこずはそれほど重芁ではありたせん。 したがっお、bmmにdeterministic匕数を远加するべきではなかったでしょう。 䜕かを盎接切り替えたい堎合は、内郚関数を公開するこずを怜蚎するかもしれたせんが、 deterministicを関数自䜓で盎接䜿甚するこずはできたせん。

どう思いたすか ドキュメントを倉曎するこずは、おそらく持続可胜な道を歩むための最も簡単な方法だず思いたす。 網矅的なリストを䜜成する方法など、他にもいく぀かの詳现がありたすが、これらのセマンティクスは、実際には真にならない「理想的な」セマンティクスよりもおそらく理にかなっおいたす。

cc @gchanan @mruberry

党おのコメント67件

これは私からの芪指です。 問題は䞻に、これをコヌドベヌスのどこにでも実際に展開する方法です。 私たちが決定論的であるず䞻匵するこずはさらに悪いこずではありたせんが、密かにそうではありたせん:)

私はそれですべおです。私のアプロヌチは、決定論がオンになっおいるずきに操䜜ず゚ラヌにフラグを立おるこずですが、そうではないこずがわかっおいたす。

非決定論的な操䜜での゚ラヌは厳しすぎるず思いたす。 譊告はよりスムヌズな䜓隓のようです

デフォルトはthrowである必芁があるず思いたすが、そこで耇数倀のプロパティをサポヌトできるず思いたす非決定論的は問題ありたせん、譊告、throw。

譊告のナヌスケヌスは実際には芋られないこずを認めなければなりたせん。 人々がそれをオンにするのに十分な決定論を気にするずき、圌らはおそらく゚ラヌを予期するでしょう。 特定の呌び出しではい぀でもオフに切り替えお、そこにある非決定性に問題がないこずを䌝えるこずができたす。

゚ラヌ、譊告、適切なドキュメント...
埌者は必須です。
譊告たたぱラヌ ゚ラヌが発生したす。

投げるのは玠晎らしいようです。 私は、投げる代わりに譊告するオプションを䞎えるこずは合理的であるように思われるずいうアダムに同意したす。

量り入れおくれおありがずう。結局、䞉元旗の䞻な努力は旗そのものであり、それは難しいこずではありたせん。
Context.hにフラグを远加し、ナヌティリティ関数を介しおAT_ERRORずAT_CHECKを振りかけたす。

こんにちは、
この旗のニュヌスはありたすか
決定論は非垞に重芁です。
私の経隓から、珟圚のバヌゞョンでは、固定シヌドを䜿甚しお、1 gpuで、粟床1e-16たでの決定論が可胜です。 埮小な違いが増幅され、結果が発散する可胜性があるこずに泚意しおください。

multigpuの堎合も考慮しおください少なくずも固定のK gpusの堎合、動䜜は決定論的である必芁がありたす。理由により、時々故障するある皮の決定論を達成するこずができたす。今のずころ理解しおいたせんナむトリヌビルド1.2.0.dev20190616を䜿甚。 私は今それに苊しんでいたす1 、 2 。

ありがずう

@ t-viあなたはこれに積極的に取り組んでいたすか

私はあなたがそれをするのを劚げたくありたせん。

@ t-vi䞍明な点がある堎合は申し蚳ありたせんが、これに取り組む予定はありたせん:)。 誰かが積極的にそうしおいるのかどうかを理解しようずしおいただけです。

ほが1幎経っおも、非決定論的補間の問題はただ解決されおいたせん。

コミュニティがこの機胜を远加するこずを願っおいたす:)

たぶん、決定論的な補間はナヌザヌに倧きな助けをもたらすでしょう。

〜私はただ実際に宣䌝しおいたせんが、割り圓おられた開発者リ゜ヌスよりもナヌザヌの関心が高いように思われるため、これを蚭定したずきにgithubスポンサヌシップペヌゞに投祚できるプロゞェクトずしおリストされおいたす。
幎末たでに順調に進展できるず確信しおおり、補間は確かに修正方法の蚈画の1぀です問題のどこかにあるfoldの擬䌌コヌドず同様が、そうではありたせん。私自身の優先順䜍リストの䞊䜍にはありたせん。〜
面癜くないこずがわかった。

決定論的補間は倧きな助けになりたす。 リンク

ナヌザヌフィヌドバックに基づくバンピング優先床、特にCUDAの堎合

修正されおよかったです、ありがずうございたす

@ t-vi公平を期すために、「バンピング優先床」は「修正䞭」ず同等ではないず思いたす:)。

解決策を楜しみにしおいたす

colesburyは、決定論的アルゎリズムの1぀のキラヌな理由は、決定論が実際に問題であるためではなく、これをオンにするず陀倖できるず述べたした;

torch.experimental.deterministicはRNGシヌドずどのように盞互䜜甚する必芁がありたすか 手動シヌドが蚭定されおいない堎合、デフォルトシヌドを蚭定する必芁がありたすか 手動シヌドが蚭定されおいない堎合、譊告を発行する必芁がありたすか

ナヌザヌがシヌドを蚭定しおいない堎合は、シヌドを蚭定しないこずをお勧めしたす。 1぀は、䞍芁な2぀のむンタヌフェむスを結合しおいるためです決定論を気にするナヌザヌは、RNGを非垞によく理解しおいるず思いたす。 さらに重芁なこずに、これを確実に行うのは非垞に困難です。 マルチプロセス/スレッド化されたアプリケヌションでRNGを䜿甚したり、他のtorch.Generatorサブクラスを䜿甚したり、 numpy.randomたりするこずもできたす。

譊告に぀いおは、蚭定するのに適切な堎所がある堎合にのみわかりたせんたずえば、RNGが䜿甚されおいるのず同じモゞュヌル/関数ではなく、 determinism=True前にシヌドを匷制したすか。

torch.backends.cudnn.deterministic=Trueを蚭定しおも、補間挔算子が決定論的ではないこずに興味がありたす。 pytorch補間はcudnnを䜿甚したせんか

そうではないかもしれたせん。 補間の実行をnvprofしお、確実にチェックするこずができたす。

torch.experimental.deterministicが実装されたら、関数呌び出しでdeterministic匕数を提䟛し続ける必芁があるかどうか疑問に思っおいたす。 ナヌザヌは、䞀郚の操䜜には決定論を、他の操䜜には速床を奜む可胜性があるため、おそらくそうすべきです。

匕数を保持するず、 torch.experimental.deterministicず関数のdeterministicフラグが互いに反察になるずどうなりたすか。 torch.experimental.deterministic = Trueは「すべおの堎合に決定論を䜿甚する」を意味するか、「デフォルト倀ずしお決定論を䜿甚する」を意味する必芁がありたすが、関数呌び出しでdeterministic匕数が指定されおいる堎合は、その特定の関数呌び出しの蚭定。」 蚀い換えれば、以䞋のコヌドはどのように凊理する必芁がありたすか torch.backends.cudnn.deterministicフラグが同様の状況でどのように機胜するかを誰かが知っおいたすか

torch.experimental.deterministic = True
torch.some_operation(deterministic=False)

@kurtamohler良い質問です。 最も簡単な解決策は、 bool? deterministic=Noneにしおから、 Noneを「 torch.experimental.deterministic尊重する」ずいう意味に解釈するこずです。それ以倖の堎合は、ナヌザヌが芁求したものを正確に䜿甚したす。

私たちは、䞀皮の畳み蟌みず䌌たような状況を持っおいるが、それは行われおいた方法があるこずがありたしたconvolutionなしでbenchmark 、匕数、および_convolution明瀺しお基準。

これらの解決策のどちらも受け入れられるず思いたす。 ただし、畳み蟌みアプロヌチには、内郚deterministicフラグをナヌザヌに衚瀺されるAPIにリヌクしないずいう远加の利点がありたす内郚APIを䜿甚しない堎合。

「どこでも決定論的でありたいが、_この特定の挔算子ではない_」の理由は䜕ですか これは、倚くの挔算子およびほずんどの耇雑な挔算子に远加の入力を远加するこずを保蚌するのに十分な䞀般的なナヌスケヌスであるず本圓に考えられおいたすか IMOは、決定論を切り替えるためのコンテキストマネヌゞャヌを提䟛する方がよいでしょう。

@apaszke 、ええ、決定論を切り替えるためにコンテキストマネヌゞャヌを䜿甚する方が良いず思いたす。 deterministic匕数を挔算子に远加する必芁があるずは蚀いたせんが、䞀郚の挔算子にはすでに匕数がありたす。 それらをすべお削陀しおBCを壊すのが最善でしょうか、それずもそれらを維持しおtorch.experimental.deterministicをオヌバヌラむドできるようにするのが最善でしょうか

削陀するか、少なくずもプラむベヌトにする必芁がありたす぀たり、アンダヌスコアプレフィックスたたはsth。

補間関数の決定論的機胜が閉じられ、実装されないのではないかず思いたすか

いいえ、PyTorchのすべおの関数の決定論的バヌゞョンを受け入れたす

@ezyangどのpytorchバヌゞョンが決定論的なF.interpolate関数を持っおいたすか pytorch 1.6から始たっおいたすか たたは、最新の安定バヌゞョン1.5で利甚できたすか たたは、゜ヌスからPytorchをダりンロヌドしおむンストヌルする必芁がありたすか

私はこれに取り組み始めおうれしいです

䞊蚘のコミットはフラグを远加するだけで、ただ操䜜には圱響したせん。 誰かがそれを芋お、私が䜕か間違ったこずをしたかどうか、たたはこれたでに䜕かを改善できるかどうかを教えおいただければ幞いです。 これは、 torch.backends.cudnn.deterministic実装方法に基づいおいたす。

これは問題ないように芋えたすが、内郚の名前には実隓的なものを含めるべきではないように感じたす衚面䞊は、実隓的なものにしたくないので、すべおの実装ビットの名前を倉曎する必芁はありたせん

@ezyang 、ええ、それは理にかなっおいたす、名前を倉曎したす。

@ t-viがこの問題に関する以前の䜜業で行ったのず同様に、 torch.experimental.deterministic_error_levelを远加したした。 deterministic_error_levelは、 deterministic == Trueず特定の関数に決定論的な実装がない堎合に、゚ラヌ/譊告の動䜜を制埡したす。 2゚ラヌ、1譊告、たたは0サむレントに蚭定できたす。

ナヌザヌがそれを他の倀に蚭定した堎合、キャッチ可胜なpythonランタむム䟋倖をスロヌしたいず思いたす。 通垞、この皮の動䜜にはTORCH_CHECK()を䜿甚したすが、この堎合、䟋倖をキャッチできず、理由がわかりたせん。 これがTORCH_CHECK()呌び出しですリンク

これは、そのチェックが倱敗したずきに起こるこずです。

>>> import torch
>>> try:
...     torch.experimental.deterministic_error_level=50
... except:
...     print('exception caught')
... 
terminate called after throwing an instance of 'c10::Error'
  what():  error level 50 is invalid, must be one of 0: None, 1: Warn, or 2: Error
Exception raised from longToErrorLevel at ../aten/src/ATen/Context.cpp:85 (most recent call first):
frame #0: c10::Error::Error(c10::SourceLocation, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) + 0x58 (0x7f53e2cc0878 in /work/kurtamohler/development/pytorch-deterministic-flag/torch/lib/libc10.so)
frame #1: at::Context::longToErrorLevel(long) + 0x122 (0x7f53f6d61a82 in /work/kurtamohler/development/pytorch-deterministic-flag/torch/lib/libtorch_cpu.so)
frame #2: THPModule_setDeterministicErrorLevel(_object*, _object*) + 0x31 (0x7f53fb5625d1 in /work/kurtamohler/development/pytorch-deterministic-flag/torch/lib/libtorch_python.so)
<omitting python frames>
frame #23: __libc_start_main + 0xe7 (0x7f5432d62b97 in /lib/x86_64-linux-gnu/libc.so.6)

Aborted (core dumped)

私がそれを修正する方法を誰かが知っおいるなら、私に知らせおください。

@kurtamohlerはTHPModule_setDeterministicErrorLevel HANDLE_TH_ERRORS / END_ HANDLE_TH_ERRORSマクロがありたせんか これらは、C ++䟋倖をキャッチし、それをPython゚ラヌリタヌンに倉換するために必芁です。

ああ、それでした、@ colesburyに感謝したす

atomicAddすべおの呌び出し元に非決定論的アラヌトを远加し始めおいたす。 䞀郚の発信者atomicAdd 、特定の堎合にのみadaptive_avg_pool3d_backwardは、 (isizeW%osizeW != 0) || (isizeH%osizeH != 0) || (isizeT%osizeT != 0)がtrueの堎合にのみ䜿甚されたす。 これらの堎合にのみアラヌトを出し、゚ラヌメッセヌゞでそれらを䌝えようずする必芁がありたすか、それずもatomicAddが䜿甚されるかどうかにかかわらず、これらの関数が呌び出されるたびにアラヌトを出すだけで倧䞈倫ですか

無条件にアラヌトを送信するず、実装が簡単になり、理解しやすくなりたす。

@ngimel 、私はCUBLAS_WORKSPACE_CONFIGを䜿甚しお決定論的なストリヌムの䜿甚を確実にする方法を考えおきたしたが、考慮すべき2぀の䞻芁なアプロヌチがあるず思いたす。

圱響を受けるCUDAバヌゞョン珟時点では10.2以降のいずれかを䜿甚しおいお、 torch.set_deterministic(True)が呌び出された堎合は、 std::getenvを䜿甚しお、 CUBLAS_WORKSPACE_CONFIGが:16:8いずれかであるこずを確認したす。 :4096:8 。 そうでない堎合は、1たたは2のいずれかを実行したす。

  1. 倉数を適切に蚭定するようにナヌザヌに指瀺する゚ラヌをスロヌしたす。

  2. 倉数をputenv Windowsでは_putenv で自動的に蚭定したす。 ただし、これに関連するいく぀かのさらなる蚭蚈䞊の決定がありたす。 :16:8 パフォヌマンスは䜎くなりたすがメモリ䜿甚量は少なくなりたすたたは:4096:8 パフォヌマンスは高くなりたすがメモリ䜿甚量は倚くなりたすを遞択する必芁がありたすか たた、ナヌザヌが倉数を他の非決定論的倀に蚭定した堎合、元の倀を远跡し、 torch.set_deterministic(False)が呌び出された堎合にそれを埩元する必芁がありたす。そうしないず、ナヌザヌに次のように通知する゚ラヌがスロヌされる可胜性がありたす。倉数たたはその他のスキヌムの蚭定を解陀する必芁がありたす。

たた、アプリケヌションの実行䞭に倉数を蚭定しおも実際に圱響があるかどうかわからないため、オプション2が可胜かどうかもわかりたせん。 倉数は、CUDAランタむムの開始時、たたはcuBLASハンドルの䜜成時に䞀床だけチェックされる可胜性がありたす。 これに関する情報が芋぀からなかったので、おそらく実隓的に調べる必芁がありたすどちらの方法でもテストを䜜成するには、非決定論的なストリヌム䜿甚量の再珟機胜を䜿甚する必芁があるため、これを調べたす 。 環境倉数を䜿甚するのではなく、API呌び出しも探したしたが、CUDAはそれを提䟛しおいないようです。

どのオプションが良いかに぀いお匷い意芋がありたすか オプション2はおそらくナヌザヌフレンドリヌですが、オプション1よりも透過性が䜎い可胜性がありたす。

アプリケヌションの実行䞭に倉数を蚭定しおも実際に圱響があるかどうかはわかりたせん

この質問をフォロヌアップするために、pytorchスクリプト内で環境倉数を蚭定しおも、CUDAストリヌムの決定論には圱響しないようです。 https://github.com/pytorch/pytorch/issues/39849のスクリプトを倉曎しお、耇数回実行し、トレヌニング統蚈を比范しお、非決定論的な動䜜を確認したした。 CUBLAS_WORKSPACE_CONFIG=:4096:8を蚭定しお、決定論的なストリヌムの䜿甚を保蚌しようずしたす https 

それを実行するず、スクリプト内で倉数を蚭定しおも決定論的な動䜜が埗られないこずがわかりたす。

$ python cuda_stream_nondeterminism.py 
Before setting var: not deterministic
After setting var: not deterministic
After restoring old var: not deterministic

ただし、スクリプトの倖郚で蚭定された環境倉数を䜿甚しお実行するず、決定論的になりたす。

$ CUBLAS_WORKSPACE_CONFIG=:4096:8 python cuda_stream_nondeterminism.py 
Before setting var: possibly deterministic
After setting var: possibly deterministic
After restoring old var: possibly deterministic

トレヌニング関数を5回しか実行しないため、「おそらく決定論的」ず出力され、動䜜が実際には決定論的でなくおも幞運になる可胜性があるこずに泚意しおください。

たぶん、cudaストリヌムを再初期化できれば、倉曎されたCUBLAS_WORKSPACE_CONFIG倉数を尊重するように匷制されたす。 それを詊しおみたいのですが、実行時にそれを実行する方法や可胜性すらわかりたせん。 誰かが知っおいるなら、私に知らせおください。

次の方法で新しいストリヌムを䜜成しお䜿甚できるこずがわかりたした。

with  torch.cuda.stream(torch.cuda.Stream()):

ただし、新しいストリヌムは、倉曎された環境倉数蚭定を尊重したせん。 torch.cuda.init()も芋぀かりたしたが、残念ながら、cudaがすでに初期化されおいる堎合は問題ありたせん。

したがっお、他に詊すこずができない限り、ワヌクスペヌスの構成を自動的に倉曎するこずはできないように思われるため、ナヌザヌに蚭定するように指瀺する゚ラヌをスロヌする必芁があるかもしれたせん。

はい、cudaコンテキストが初期化された埌に環境倉数を蚭定しおも効果がないため、残念ながら、それはすべおか無かの解決策です。 ナヌザヌに蚭定するように指瀺する゚ラヌをスロヌするこずは合理的に聞こえたす。

珟圚、nvcc以倖のコンパむル枈みファむルからCUDAバヌゞョンを確認するこずはできないようです。そのため、 aten/src/ATen/cuda/detail/CUDAHooks.hに远加する必芁があるず思いたすcuDNNバヌゞョンの確認はそのむンタヌフェむスの䞀郚です 。 誰かがもっずよく知っおいるなら、私に知らせおください。

䞊蚘のコミットぱラヌを远加したす。 しかし、私は今、ナニットテストをどうするかを理解する必芁がありたす。 2぀の問題がありたす

  • ゚ラヌが正しいケヌスでスロヌされおいるこずをテストするにはcuda> = 10.2で、 CUBLAS_WORKSPACE_CONFIGが正しく蚭定されおいない、テストむンフラストラクチャは、テストを実行する前に環境倉数を自動的に倉曎できる必芁がありたす。
  • 既存のtorch.set_deterministicテストが倱敗しないようにするには、 CUBLAS_WORKSPACE_CONFIGを自動的に適切に蚭定する必芁がありたす。 cuda> = 10.2を䜿甚するすべおのCIゞョブで、デフォルトでこの倉数を蚭定できる可胜性がありたす。

Pythonスクリプトから環境倉数を蚭定しおから、トヌチモゞュヌルをリロヌドしお、新しい倀を尊重するこずができるこずがわかりたした。

>>> import torch
>>> torch.set_deterministic(True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/work/kurtamohler/development/pytorch-deterministic-flag-cuda-env-var/torch/__init__.py", line 306, in set_deterministic
    _C._set_deterministic(d)
RuntimeError: To enable deterministic behavior with CUDA >= 10.2, you must set environment variable CUBLAS_WORKSPACE_CONFIG=:4096:8 or CUBLAS_WORKSPACE_CONFIG=:16:8. For more information, go to https://docs.nvidia.com/cuda/cublas/index.html#cublasApi_reproducibility
>>> import os
>>> os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8'
>>> from importlib import reload
>>> torch = reload(torch)
>>> torch.set_deterministic(True)

トヌチをリロヌドするこずでCUDAがこの倉曎を尊重するかどうかはわかりたせんが、少なくずもこれにより、゚ラヌメッセヌゞの単䜓テストを行うこずができたす。 質問する必芁がありたすが、ナニットテスト内でトヌチモゞュヌルをリロヌドするこずに問題はありたすか

線集倉曎された環境倉数を衚瀺するためにトヌチをリロヌドする必芁がないこずがわかりたした。 たた、倉数を倉曎した埌にリロヌドしおも、CUDAランタむムには圱響したせん。

䞊蚘のコミットは、以前のコメントで述べたすべおの懞念に察凊したす。 torch.set_deterministic()を呌び出すAPIテストをラップするデコレヌタを远加し、必芁な堎合にのみCUBLAS_WORKSPACE_CONFIG=:4096:8䞀時的に蚭定したした。 たた、決定論的フラグずCUBLAS_WORKSPACE_CONFIG蚭定を、テストが実行される前の状態に埩元したす。

再珟性のドキュメントには、決定論的なCuDNNの動䜜には次のものが必芁であるず蚘茉されおいるこずに気付きたした。

torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

このスレッドの誰かがbenchmarkが正確に䜕であるかを知っおいたすか、そしおなぜtorch.backends.cudnn.deterministic = Trueだけでは䞍十分ですか

torch.is_deterministic() == True堎合、 benchmarkを匷制的にオフにするこずができたす。 ぀たり、 ctx.benchmarkCuDNN()をat::_convolution()に盎接枡すのではなく、次の行でctx.benchmarkCuDNN() && !ctx.deterministic()にする必芁がありたす //github.com/pytorch/pytorch/blob/ master / aten / src / ATen / native / Convolution.cppL602

この倉曎を行わない堎合、 set_deterministicずCuDNNを䜿甚する人々はこれを行う必芁があるようです。

torch.set_deterministic(True)
torch.backends.cudnn.benchmark = False

set_deterministic()だけではすべおをカバヌできないずいう意味で、私の意芋では混乱を招きたす。

cc @ezyang @colesbury @ t-vi @ngimel

新しい畳み蟌み構成に遭遇するず、 benchmark=Trueは利甚可胜なすべおのcudnn実装を実行し、遞択した実装をキャッシュしお最速の実装を遞択するため、同じパラメヌタヌを䜿甚した埌続のすべおの畳み蟌み呌び出しでそれが䜿甚されたす。 したがっお、 deterministicもTrueに蚭定されおいる堎合、このキャッシュが存続する限り、぀たり同じプロセスにいる限り、結果は決定論的です。 実行時間が近い実装がある堎合、次にプロセスを開始しおベンチマヌクを再床実行するず、別の実装が勝぀可胜性があり、結果は䞊蚘の意味ではただ決定論的ですが前の実行ずは異なりたす。 したがっお、実行間の決定論を保蚌するには、ベンチマヌクをオフにする必芁がありたす。

そうですか。 したがっお、䞀郚のアプリケヌションでは、おそらくプロセス内の決定論のみが重芁であり、プロセス間の決定論は重芁ではないため、 torch.set_deterministic(True)を蚭定した堎合でも、ベンチマヌクを䜿甚できるず䟿利です。 その堎合、珟圚の動䜜を倉曎するべきではありたせん。 それを明確にするためにドキュメントを曎新する限り、問題は発生したせん。

PyTorchの寄皿者がtorch.set_deterministic()サポヌトを远加できるようにwikiペヌゞを䜜成したした https 

どんな改善でも倧歓迎です。

たた、「珟圚サポヌトされおいない機胜」セクションがこのwikiに含たれるべきかどうか、たたは新しいgithubの問題ずしお優れおいるかどうかもわかりたせんでしたwikiペヌゞがそれにリンクしおいる可胜性がありたす。 誰か奜みがありたすか

こんにちは、 torch.deterministic今埌の蚈画に぀いおお話ししたいず思いたす。 答える必芁のあるいく぀かの高レベルの質問がありたす

  1. torch.deterministicのセマンティクスは䜕ですか ナヌザヌは䜕を期埅しおいたすか ベスト゚フォヌトは実際にナヌザヌにずっお有甚ですか それは䟿利ではない堎合、それは定矩するこずをお勧めしたすtorch.deterministic䜕それが制埡操䜜の面で
  2. torch.deterministicフラグができたので、 deterministic=キヌワヌド匕数を公開APIから完党に削陀するのは理にかなっおいたすか bmm 、私はあなたを芋おいたす。
  3. この䜜品の最終的なゲヌムは䜕ですか あなた@kurtamohlerは、䞀般的なコミュニティず比范しお、どれだけの䜜業を行う予定ですか。ここであなたの任務を終えるず、合理的な状態はどのようになりたすか

1から始めお、torch.deterministicの珟圚のドキュメントには次のように曞かれおいたす。

     r"""Sets a global flag to force all operations to use a deterministic
    implementation if available. If an operation that does not have a
    deterministic implementation is called while this setting is True, the
    operation will throw a RuntimeError.

    Note that deterministic operations tend to have worse performance than
    non-deterministic operations.

これは最終的な最終状態には圓おはたるかもしれたせんが、これは珟圚の状況を䞍正確に衚しおおり、倚くの操䜜が監査されおおらず、特定のモデルに぀いお、 torch.deterministicが実際にそれを実行するかどうかはわかりたせん。猶に蚀い、モデルを決定論的にしたす/ nondetをヒットしたずきに゚ラヌを発生させたす。 したがっお、基本的に、私たちの実装はこれらのセマンティクスに関しおバグがあり、予芋可胜な将来にわたっおバグがあり続けるでしょう。 これは、良い状態ではありたせん。

これを改善するために、torch.deterministicのドキュメントを倉曎するこずができたす。 いく぀かの可胜な倉曎

  • torch.deterministicはベスト゚フォヌトですが、非決定論を捕らえないこずがわかった堎合は、バグを報告しおください
  • torch.deterministicは、これらの挔算子の動䜜を切り替えたすそしお、切り替えた挔算子の完党なリストを提䟛したす

2番目の箇条曞きは2に぀ながりたす。決定論を切り替える方法ずしおtorch.deterministicが存圚する堎合、ナヌザヌAPIで盎接決定論をサポヌトするこずはそれほど重芁ではありたせん。 したがっお、bmmにdeterministic匕数を远加するべきではなかったでしょう。 䜕かを盎接切り替えたい堎合は、内郚関数を公開するこずを怜蚎するかもしれたせんが、 deterministicを関数自䜓で盎接䜿甚するこずはできたせん。

どう思いたすか ドキュメントを倉曎するこずは、おそらく持続可胜な道を歩むための最も簡単な方法だず思いたす。 網矅的なリストを䜜成する方法など、他にもいく぀かの詳现がありたすが、これらのセマンティクスは、実際には真にならない「理想的な」セマンティクスよりもおそらく理にかなっおいたす。

cc @gchanan @mruberry

@ zou3519は、 https //github.com/pytorch/pytorch/pull/38683#issuecomment-662590937でもQず亀差したした

@ ezyang 、 @ mruberryの質問をお寄せいただきありがずうございたす。 私が曞いた文曞が珟圚の状態の誀った衚珟であるこずに同意したす。

torch.set_deterministic()圱響するすべおの関数を網矅的にリストしお、ナヌザヌに嘘を぀かないようにするずいうアむデアが奜きです。 1.6.0、@ zou3519に远加しおいただきありがずうございたす。

deterministic蚭定を盎接関数の匕数ずしお提䟛するべきではないこずに同意したす。

゚ンドゲヌムに関しおは、必芁な限りこれに取り組んでいきたいず思いたすが、誰もがすぐに助け方を孊べるように蚭定する必芁がありたす。

長期的には、圱響を受ける機胜の完党なリストを提䟛するこずは有効な決定だず思いたすが、戊略だけで決定論的フラグの有甚性を最倧化するずは思いたせん。 次のように1぀の特定の環境で関数を分類できたす。

  1. 決定論的
  2. デフォルトでは非決定論的ですが、決定論的フラグ゚ラヌたたは代替実装のいずれかをサポヌトしおいたす
  3. 非決定論的であり、決定論的フラグをサポヌトしおいたせん

もちろん、理想的なケヌスは、カテゎリ3を完党に削陀するこずです。そうすれば、カテゎリ2の関数のリストで十分です。 ただし、カテゎリ3の関数はかなりの期間存圚したすたたは、すべおの貢献者が決定論の問題を認識しおいない堎合、たたはコミットによっお関数の決定論が誀っお削陀される堎合などは、氞久に存圚したす。 したがっお、すべおのカテゎリ2関数の完党なリストがある堎合でも、リストに衚瀺されない関数が決定論的であるかどうかをナヌザヌが簡単に知る方法はありたせんカテゎリ1たたは3の可胜性がありたす。 たずえば、 torch.addはリストに衚瀺されないので、ナヌザヌはそれが決定論的であるこずをどのようにしお知るのでしょうか。

おそらく、カテゎリ3の機胜のリストを維持するこずも考えられたす。 しかし、これらのリストを手動で維持するこずは倚くの理由で非垞に難しいので、それをいくらか自動化できるかどうか疑問に思いたす。 すべおの関数で決定論テストを実行するCIゞョブを蚭定できる可胜性がありたす。 関数が決定論的であるこずを100垰玍的に蚌明するこずは䞍可胜であり、運が悪ければ、非決定論的関数が同じ結果を耇数回䞎えるこずがありたす。 ただし、これらのテストを頻繁に実行するほど、各関数がどのカテゎリに含たれるかに぀いお自信を持おるようになりたす。

たた、各機胜や各プラットフォヌムに぀いお私たちが知っおいるこずず知らないこずをすべおナヌザヌに最も効率的に䌝える方法に぀いおの質問もありたす。 たぶん、各プラットフォヌムですべおのカテゎリ2ず3の関数のテヌブルを䜜成できたす。 決定論テストでこのテヌブルが正しいこずを自動的に怜蚌できれば䟿利です。

ブレヌンストヌミングをするだけで、これらのアむデアは䟡倀があるよりも難しいかもしれたせん。 より実甚的な蚈画は、たずえ理想的でなくおも、はるかに持続可胜である可胜性がありたす。

torch.add決定論的ですか

import torch
n = 512
device = 'cuda'
a = torch.arange(n**3, device=device, dtype=torch.float32)
a = a.reshape((n, n, n))
b = torch.arange(n**3, device=device, dtype=torch.float32)
b = b.reshape((n, n, n))
out_zero = torch.zeros((n, n, n), device=device)
out_zero = out_zero.set_(out_zero.storage(), storage_offset=0, size=a.size(), stride=(1,1,1))
out_one = torch.zeros((n, n, n), device=device)
out_one = out_one.set_(out_one.storage(), storage_offset=0, size=a.size(), stride=(1,1,1))

torch.add(a, b, out=out_zero)
torch.add(a, b, out=out_one)
(out_zero == out_one).all()
: tensor(False, device='cuda:0')

オヌバヌラップしたテン゜ルは、私たちが目指しおいる決定論契玄に違反しおいるこずを文曞化する必芁がありたす。

「決定論」フラグの圱響を受ける操䜜をリストするのは良いこずのように思えたす。 ただし、少し埌退するず、実際には2぀のこずに぀いお話しおいるように芋えたす。

  • 可胜な堎合は、決定論的なバヌゞョンの操䜜を芁求する use_deterministic 
  • 操䜜が非決定的である堎合の譊告

最初のもののフラグは簡単に思えたす。 ただし、2番目は少し泚意が必芁です。 特にバヌゞョンやハヌドりェア間で、oneDNN、cuDNN、MAGMAなどの数孊ラむブラリの操䜜が決定論的であるかどうかを刀断するのが難しいのではないかず心配しおいたす。 @kurtamohler、これに察凊する最善の方法に぀いおのアむデアはありたすか おそらく、すべおのネむティブの非決定論的操䜜に぀いお譊告し、数孊ラむブラリの呌び出しが行われたずきにも譊告するこずができたすか プロセスごずに1回の譊告は、それほど煩わしいものであっおはなりたせん。

譊告ぞのこのアプロヌチでは、皌働する前に倚くのアルゎリズムず呌び出しサむトを確認する必芁がありたすが、決定論的アルゎリズムが利甚可胜な堎合は、フラグをブロックしお遞択する必芁はありたせん。

議論䞭の3番目のこずは、決定論的アルゎリズム遞択をグロヌバルフラグを介しお、たたは関数のkwargsずしお提瀺するための最良の方法ですが、フラグの蚈画を決定するたで、その議論を遅らせるこずができるず思いたすか

ここで完璧を善の敵にすべきではないず思いたす。 PyTorchで自己重耇テン゜ルを䜿甚するこずが100安党であった時期はわかりたせんが、䞀般の人々が䜿甚するのはそうではないずいう印象がありたす。

フォヌラムからの私の印象は、ほずんどの人が䜕かを2回実行し、それから異なるグラデヌションを取埗するこずに驚いおいるこずです。ほずんどの堎合、atomicAddを䜿甚するPyTorchのネむティブ関数の1぀が原因です。
そのための譊告が衚瀺された堎合は、人々が疑問に思っおいるほずんどのケヌスをカバヌしおいたす。 その半分のように感じるものは、実際には埌方ぞのアップスケヌリングによるものです。

倖郚ラむブラリに関する限り、これがベスト゚フォヌトであり、問​​題を知るたびに譊告を远加するこずを明確に述べる必芁があるず思いたすが、私の印象では、ネむティブカヌネルが実際に最も重芁なものであるず思いたす。

PyTorchで自己重耇テン゜ルを䜿甚するこずが100安党であった時期はわかりたせんが、䞀般の人々が䜿甚するのはそうではないずいう印象がありたす。

はい。そうするプログラムはすべお、゚ラヌずしお合理的に分類される可胜性がありたす。 私は、これらのフラグに぀いお思い぀いた契玄を文曞化するように泚意する必芁があるこずを意味したした。

倖郚ラむブラリに関する限り、これがベスト゚フォヌトであり、問​​題を知るずきに譊告を远加するこずを明確に述べる必芁があるず思いたす...

ドキュメントは、「非決定論的であるこずが知られおいる数孊ラむブラリ呌び出し...」のようなものを蚀うかもしれたせんか

私は@ t-viに同意したすそしお、報告された非決定性の半分が埌方にアップスケヌリングしおいるずいう芳察が本圓に奜きです。 特に、非決定論的であるこずが知られおいる関数を郚分的に文曞化したたたは決定論的であるず䞀郚の関数を郚分的に文曞化した状態は、たったく䜕も瀺さない状態よりも厳密に優れおいるず思いたす-重芁なこず私たちがサポヌトしおいないこずをサポヌトするず䞻匵しないこずです 決定論のテストをどのように行うこずができるかを考えるこずは有甚な掻動であるこずに同意したすが、これは明らかに非決定論的であるAPIにフラグを立おるのず盎亀する掻動だず思いたす。

たくさんのアむデアが浮かんできたので、それらのいく぀かに぀いおの私の具䜓的な考えを玹介したす。

  1. 「おそらく、カテゎリヌ3の機胜のリストを維持するこずも考えられるでしょう。」 これは倧倉な䜜業のようです。 おそらく、決定論のためにいく぀かの調敎を明瀺的に行った関数おそらく、決定論的フラグをサポヌトする関数に察しおのみ䟡倀があるず思いたす。
  2. 「すべおの関数で決定論テストを実行するCIゞョブを蚭定できる可胜性がありたす。」 このようなこずは、その性質䞊、非決定論的なものをテストしおいるため、现心の泚意を払っお行う必芁があるず思いたす。぀たり、決定論テスト自䜓が「䞍安定」です堎合によっおは合栌し、他の堎合は倱敗したす。 。 私たちのCIレポヌトツヌルは、このような状況をうたく凊理したせん。
  3. 「ただし、2぀目は少し泚意が必芁です。特に、バヌゞョンやハヌドりェア間で、oneDNN、cuDNN、MAGMAなどの数孊ラむブラリの操䜜が決定論的であるかどうかを刀断するのが難しいのではないかず心配しおいたす。」 これに最善を尜くす必芁がありたす。 倚くの堎合、数孊ラむブラリは、それらが決定論的であるかどうかをドキュメントで明瀺的に指定しおいるため、ドキュメントの内容を忠実に報告する必芁がありたす。
  4. 「たぶん、すべおのネむティブの非決定論的操䜜に぀いお譊告し、数孊ラむブラリの呌び出しが行われたずきにも譊告するこずができたすか」 私たちはこれをすべきではないず思いたす。 非決定性に぀いお譊告するずき、それは非決定性が起こっおいるからであり、起こっおいるかもしれないずいうこずではありたせん。 譊告しすぎるず、人々は譊告を無芖し始めたす。

クロスバヌゞョン/ハヌドりェアの決定論に぀いお心配する必芁はないず思いたす。幞運を祈りたす。

非決定性に぀いお譊告するずき、それは非決定性が起こっおいるからであり、起こっおいるかもしれないずいうこずではありたせん。 譊告しすぎるず、人々は譊告を無芖し始めたす。

トリッキヌに芋えたす。 たずえば、いく぀かのopを実行しおいお、PyTorchの実装が決定論的であるが、䞀郚の拡匵機胜がディスパッチキヌ、トヌチ関数などを介しお䜕かをオヌバヌラむドし、今はわかりたせん。 それが実際に私の非決定論の原因である堎合、それは譊告されないのは残念なこずのように思えたす。

それが実際に私の非決定論の原因である堎合、それは譊告されないのは残念なこずのように思えたす。

もちろんですが、ナヌザヌが非決定論的なシェナニガンに私たちを関䞎させるこずもできたせん。もちろん、譊告を受けるこずは期埅できたせん;

フラグAPIが存圚し、十分に文曞化されおいるため、この問題を今すぐ解決できるず思いたす。

@kurtamohler玠晎らしい仕事。 ありがずう。

぀たり、 torch.manual_seed(111)を䜿甚しお、 interpolation操䜜を含むすべおを決定論的に蚭定できるずいうこずですか

いいえ。再珟性/ランダム性に関する泚蚘を
これたでのずころ、むンフラストラクチャがあり、非決定論に関する既知の゜ヌスにマヌクを付け、ドキュメントを倧幅に改善しお、䜕が起こっおいるのかを知るこずができたす。
非決定論的な操䜜を実行した堎合でも、運が悪いこずになりたすが、今ではそれに取り組む方が合理的です。

特に補間は、それほど耇雑ではないカヌネルを埌方に蚘述するこずで決定論的にするこずができるもののようです。

@ t-viこんにちは、pytorch 1.7がリリヌスされたので、補間埌方カヌネルは曎新されたしたか

したがっお、CUDAアップサンプリングカヌネルずバックワヌドはaten/src/ATen/native/cuda/UpSample*たす。 grepは、線圢、双線圢、3次が非決定論的な埌方譊告マヌカヌを持っおいるを持っおいるこずを瀺唆しおいたすが、最も近いものは持っおいたせん。
ただし、@ kurtamohlerの方がはるかに良い質問です。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡