私はPython(3.5
)PyCharmを使用したプログラム(PyCharm Community Edition 2016.2.2 ; Build #PC-162.1812.1, built on August 16, 2016 ; JRE: 1.8.0_76-release-b216 x86 ; JVM: OpenJDK Server VM by JetBrains s.r.o
)Windows10の場合。
問題:いくつかのブレークポイントで停止すると、デバッガウィンドウが「データの収集」でスタックし、最終的にタイムアウトします。(withフレーム変数を表示できません)
表示されるデータは特別なものでも、特に大きなものでもありません。上記のデータのいくつかの値の条件付きブレークポイントが正常に機能するため(プログラムがブレークする)、PyCharmで何らかの形で利用できます操作目的ではなく)表示のみのためにデータを収集するプロセスが失敗するようです。
ブレークポイントがある場所の周りの関数にステップインすると、そのデータが正しく表示されます。スタックを上に行くと(呼び出し元の関数、最初にブレークポイントを設定したい場所)-「データの収集」タイムアウトが再び発生します。
少なくとも2005年以来、同じ点で多くの問題が提起されています。修正されたものもあれば、修正されていないものもあります。修正は通常、最新バージョン(私が持っている)へのアップデートでした。
---(この一連の問題を修正または回避するために進むことができる一般的な方向性はありますか?
編集:1年後、問題はまだ存在しており、バグが発生した後も開発者/サポートからの反応はありません。
2018年4月編集:問題は2018.1バージョンで解決されたようです、print
行にブレークポイントを設定するときにハングしていた次のコードが機能するようになりました(変数を確認できます) )::
import threading
def worker():
a = 3
print('hello')
threading.Thread(target=worker).start()
これは、デフォルトのメソッド__str __()が冗長すぎるクラスがあることが原因だと思います。 Pycharmはこのメソッドを呼び出して、ブレークポイントに到達したときにローカル変数を表示し、文字列のロード中にスタックします。これを克服するために使用するトリックは、エラーの原因となっているクラスを手動で編集し、冗長性の低いものを__str __()メソッドに置き換えることです。
例として、これはpytorch _TensorBaseクラス(およびそれを拡張するすべてのテンソルクラス)で発生し、pytorchソースtorch/tensor.pyを編集し、__ str __()メソッドを次のように変更することで解決できます。
def __str__(self):
# All strings are unicode in Python 3, while we have to encode unicode
# strings in Python2. If we can't, let python decide the best
# characters to replace unicode characters with.
return str() + ' Use .numpy() to print'
#if sys.version_info > (3,):
# return _tensor_str._str(self)
#else:
# if hasattr(sys.stdout, 'encoding'):
# return _tensor_str._str(self).encode(
# sys.stdout.encoding or 'UTF-8', 'replace')
# else:
# return _tensor_str._str(self).encode('UTF-8', 'replace')
最適とはほど遠いですが、手元にあります。
更新:少なくとも私に影響を与えていたケースでは、エラーは最後のPyCharmバージョン(2018.1)で解決されたようです。
PyTorch(または他のディープラーニングライブラリ)を使用しているためにここに着陸し、PyCharm(torch 1.31、PyCharm)でデバッグを試みた場合私の場合は2019.2)ですが、非常に遅いです:
有効にするGevent compatible
の中に Python Debugger
設定linkliu mayuyuが指摘しました。この問題は、大規模な深層学習モデル(私の場合はBERTトランスフォーマー)のデバッグが原因で発生する可能性がありますが、これについては完全にはわかりません。
2019年の終わりであり、これはまだ修正されていないようですので、この回答を追加します。さらに、これはディープラーニングを使用する多くのエンジニアに影響を与えていると思うので、私の回答フォーマットがスタックオーバーフローアルゴリズムをトリガーすることを願っています:-)
SympyとPythonモジュール 'Lea'を使用して確率分布を計算することを目的としたコードで作業していたときにもこの問題が発生しました。
タイムアウトの問題を解決するために私が行ったアクションは、デバッグ設定の「変数の読み込みポリシー」をデフォルトの「非同期」から「同期」に変更することでした。
PyTorch(PyCharm 2019.3)によって記述されたいくつかのディープラーニングスクリプトを実行しようとしたときに、同じ問題が発生しました。
私はついに、問題はDataLoader
のnum_workers
を大きな値(私の場合は20
)に設定することであることがわかりました。
したがって、デバッグモードでは、num_workers
を1
に設定することをお勧めします。