Numpy: 時々、supress_warningsはその属性の1぀を芋逃したす

䜜成日 2016幎12月23日  Â·  60コメント  Â·  ゜ヌス: numpy/numpy

skimageをコンパむルしようずするず、次の゚ラヌが発生するこずがありたす。

Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/build/skimage-0.12.3/debian/tmp/usr/lib/python2.7/dist-packages/skimage/transform/tests/test_integral.py", line 46, in test_vectorized_integrate
    assert_equal(expected, integrate(s, r0, c0, r1, c1))  # test deprecated
  File "/build/skimage-0.12.3/debian/tmp/usr/lib/python2.7/dist-packages/skimage/transform/integral.py", line 86, in integrate
    warn("The syntax 'integrate(ii, r0, c0, r1, c1)' is "
  File "/build/skimage-0.12.3/debian/tmp/usr/lib/python2.7/dist-packages/skimage/_shared/_warnings.py", line 16, in warn
    warnings.warn(message, stacklevel=stacklevel)
  File "/usr/lib/python2.7/dist-packages/numpy/testing/utils.py", line 2199, in _showwarning
    self._orig_show(message, category, filename, lineno,
AttributeError: 'suppress_warnings' object has no attribute '_orig_show'

これは厄介な問題だず思いたすが、よくわかりたせん。

00 - Bug numpy.testing

党おのコメント60件

うヌん、少し奇劙です。 skimageテストで進行䞭の奇劙なスレッドはありたすか 譊告凊理はPythonではスレッドセヌフではないため、これは譊告テストをかなりひどく壊したす。 これが他にどのように発生するかを確認するのは少し難しいですが、テストが実行する正確なコヌドを確認する必芁がありたす。

assert_warnsかそこらがないので、ここにあるず思いたす。 生きおいるのはsuppress_warnings぀の_orig_showが定矩されおいないのは、コンテキストがすでに終了しおいる堎合にのみ可胜であるずいうこずです。 その時点で、 warnings.showwarningはすでに叀い倀にリセットされおいるはずです。

もちろん、スレッドがある堎合は、譊告党䜓が機胜しなくなりたす。 䟋えば

thread1譊告コンテキストに入りたす->通垞の譊告印刷を眮き換えたす
thread2譊告コンテキストに入りたす-> thread1譊告ハンドラヌを眮き換えたす
thread1譊告コンテキストを終了したす->通垞の譊告印刷にリセットしたす
thread2譊告コンテキストが存圚したす-> thread1の譊告ハンドラヌにリセットしたす-> kaboom。

ずころで。 「skimageの__warning_registry__ものの埌でクリヌンアップしおみおください。抑制譊告は、同様の問題を解決しようずするそしお他のいく぀かのものを远加するコンテキストマネヌゞャヌであり、興味深い堎合ずそうでない堎合がありたす。

Debian甚のskimageをビルドしようずしたずきに問題が発生したしたが、ここではわかりたせん。 ただし、scikit-image / scikit-image2412を開いお参加させたした。

完党を期すために時々、skimageを䜿甚せずにスタックトレヌスを取埗するこずもありたす。

ERROR: test suite for <module 'skimage.transform.tests' from '/build/skimage-0.12.3/debian/tmp/usr/lib/python3/dist-packages/skimage/transform/tests/__init__.py'>
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/nose/suite.py", line 229, in run
    self.tearDown()
  File "/usr/lib/python3/dist-packages/nose/suite.py", line 352, in tearDown
    self.teardownContext(ancestor)
  File "/usr/lib/python3/dist-packages/nose/suite.py", line 368, in teardownContext
    try_run(context, names)
  File "/usr/lib/python3/dist-packages/nose/util.py", line 453, in try_run
    inspect.getargspec(func)
  File "/usr/lib/python3.5/inspect.py", line 1040, in getargspec
    stacklevel=2)
  File "/usr/lib/python3/dist-packages/numpy/testing/utils.py", line 2199, in _showwarning
    self._orig_show(message, category, filename, lineno,
AttributeError: 'suppress_warnings' object has no attribute '_orig_show'

どのバヌゞョンのpython、numpyなどをコンパむルしおいたすか

Numpy 1.12〜RC〜ベヌタ1、Python2.7および3.5
申し蚳ありたせんが、私の間違いRCをただチェックしおいたせん

うヌん、私は混乱しおいたす....なぜスレッドの問題が発生するのかわかりたせんが、競合状態たたはcatch_warningようなものを含むの誀ったネストなしで発生するこの゚ラヌを実際に理解するこずはできたせんsuppress_warning 。

たた、垞に発生するずは限らないため、競合状態だず思いたす。 たったく同じ環境でビルドを2回実行するず、問題が別の堎所で発生したすたたはたったく発生したせん。

@oleboleテストスヌツをどの皋床正確に実行しおいたすか

テストスむヌトからコピヌ

#!/bin/sh
set -efu

pys="$(pyversions -rv 2>/dev/null)"
pkgbuild=${pkgbuild:-no}

srcdir=$PWD

for py in $pys; do
    echo "=== python$py ==="
    if [ "$pkgbuild" = "yes" ]; then
        export PYTHONPATH="$srcdir/debian/tmp/usr/lib/python$py/dist-packages"
        cd "$srcdir/build/"
    else
        cd "$ADTTMP"
    fi

    xvfb-run -a python$py /usr/bin/nosetests -s -v --exclude test_tools.py skimage 2>&1
done

テストはX11環境で実行する必芁があるため、 xvfb-runがありたす。

うヌん、錻がモゞュヌルをテストし始めたずきにボンネットの䞋で正確に䜕が起こるか知っおいる人はいたすか 錻は私を混乱させたす、そしおなぜそれが譊告をいじり回しおしたうのか分かりたせん...たたはそれは結局譊告を抑制するこずのバグですが、実際にはそれを芋るこずができたせんね。

私のnosetestsのmanペヌゞには、

       --processes=NUM
              Spread  test run among this many processes. Set a number equal to the number of processors or cores in your machine for best results. Pass a negative
              number to have the number of processes automatically set to the number of cores. Passing 0 means to disable parallel testing.  Default  is  0  unless
              NOSE_PROCESSES is set. [NOSE_PROCESSES]

デフォルトでは䞊列テストはないようです。 少なくずも、競合状態はそこにあるべきではありたせん。

ガベヌゞコレクションに基づいお、noseがこのteardownContextを実行する可胜性はほずんどありたせんか

いいえ、私はおそらくばかげおいたす。 抑制譊告コンテキストは、属性を削陀する前にwarnings.showwarningリセットするため、gcが起動しおも、他に䜕かが行われなければ実際には䜕も䜜成できないこずを疑っおください。 他に䜕がわからなかった:)。

skimage-0.9.3で33個の゚ラヌが発生したした。ほずんどがPILたたはむンデックス䜜成によるものですが、抑制に関する゚ラヌはありたせん。 他のすべおの゚ラヌにどのように察凊したすか

@charrisこの問題は、0.9.3ではなく0.12.3で報告されおいたす。 :)

OK、぀いにそれをアップストリヌムからプルダりンしたした。今では39の゚ラヌず倧量の非掚奚です。 譊告のほずんどは、テストがWaylandではなくQTで実行されおいるず芋なしおいるためず思われたすが、ここでは構成の問題である可胜性がありたす。 たた、次のようにテストを実行する必芁がありたす

python -c'import skimage; skimage.test()'

nosetestsはたったく機胜しないため。

非掚奚は正垞です。 廃止が予想される堎合でも、叀いAPIを匕き続きチェックしたす。 ゚ラヌに぀いおは、正垞ではありたせん。 scikit-imageバグトラッカヌで報告しおいただけたせんか

@sciuntoドキュメントでは、ロヌカルでテストするための手順を䜿甚できたす。

はい、同じ堎所にありたす。 テストは

def test_vectorized_integrate():
    r0 = np.array([12, 0, 0, 10, 0, 10, 30])
    c0 = np.array([10, 0, 10, 0, 0, 10, 31])
    r1 = np.array([23, 19, 19, 19, 0, 10, 49])
    c1 = np.array([19, 19, 19, 19, 0, 10, 49])

    expected = np.array([x[12:24, 10:20].sum(),
                         x[:20, :20].sum(),
                         x[:20, 10:20].sum(),
                         x[10:20, :20].sum(),
                         x[0,0],
                         x[10, 10],
                         x[30:, 31:].sum()])
    start_pts = [(r0[i], c0[i]) for i in range(len(r0))]
    end_pts = [(r1[i], c1[i]) for i in range(len(r0))]
    assert_equal(expected, integrate(s, r0, c0, r1, c1))  # test deprecated
    assert_equal(expected, integrate(s, start_pts, end_pts))

# test deprecatedコメントは、おそらくテストに修正が必芁であるこずを瀺唆しおいたすが、それでもsuppress_warningsはより正垞に倱敗するはずです。

もう少し情報を

$ python skimage/transform/tests/test_integral.py

NumPy run_module_suiteしおいるものは倱敗しおいないようですが、譊告を発したす

======================================================================
ERROR: skimage.transform.tests.test_integral.test_vectorized_integrate
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/home/charris/Workspace/scikit-image/skimage/transform/tests/test_integral.py", line 46, in test_vectorized_integrate
    assert_equal(expected, integrate(s, r0, c0, r1, c1))  # test deprecated
  File "/home/charris/Workspace/scikit-image/skimage/transform/integral.py", line 86, in integrate
    warn("The syntax 'integrate(ii, r0, c0, r1, c1)' is "
  File "/home/charris/Workspace/scikit-image/skimage/_shared/_warnings.py", line 16, in warn
    warnings.warn(message, stacklevel=stacklevel)
UserWarning: The syntax 'integrate(ii, r0, c0, r1, c1)' is deprecated, and will be phased out in release 0.14. The new syntax is 'integrate(ii, (r0, c0), (r1, c1))'.

scikit-imageには、 skimage/_shared/_warnings.py譊告甚に独自のコンテキストマネヌゞャヌがあるこずに泚意しおください。 suppress_warningsず競合しおいる可胜性がありたす。

奜奇心から、デフォルトのUserWarningを䜿甚する代わりに、 DeprecationWarningを明瀺的に指定するこずに違いがあるのではないかず思いたす。

だから私ぱラヌを芋たせん

$ nosetests-2.7 skimage/transform/tests/test_integral.py |& grep orig_show

䞀方、

$ nosetests-2.7 skimage/transform/tests/ |& grep orig_show

箄25の確率で衚瀺されたす。 これは、゚ラヌの原因が他の堎所にあり、倱敗したテストがそれを明らかにしおいるこずを瀺唆しおいたす。

特に、 skimage/transform/tests/test_geometric.pyには譊告コンテキストマネヌゞャヌexpected_warningsが含たれおいるため、疑わしいず思いたす。

OK、今私はtest_parallelデコレヌタ、 https//github.com/scikit-image/scikit-image/blob/master/skimage/_shared/testing.pyを疑っおい

test_parallelむンポヌトしおいる3぀のファむルを削陀するず、問題はなくなりたす。

線集そしお今、私は問題をたったく再珟するこずができたせん。 うヌん...倚分たた、マシン䞊で実行されおいる他のものに䟝存したす。

うヌん、 test_parallelは私が掚枬するこずかもしれたせんが、コヌドを調べおも、どの関数も明らかに譊告コンテキストを䜿甚しおいたせんが、䞍可胜ではないず思いたす。

test_hough_transform.py䜕かがむニシ゚ヌタヌのようです。 そのファむルを削陀しおも゚ラヌはありたせん。

線集おそらく、がtest_integral.pyモゞュヌルの前にあるためですか

問題はtest_hough_transform.pyでのこのテストにあるようです

@test_parallel()
def test_hough_circle():
    # Prepare picture
    img = np.zeros((120, 100), dtype=int)
    radius = 20
    x_0, y_0 = (99, 50)
    y, x = circle_perimeter(y_0, x_0, radius)
    img[x, y] = 1

    out1 = tf.hough_circle(img, radius)
    out2 = tf.hough_circle(img, [radius])
    assert_equal(out1, out2)
    out = tf.hough_circle(img, np.array([radius], dtype=np.intp))
    assert_equal(out, out1)
    x, y = np.where(out[0] == out[0].max())
    assert_equal(x[0], x_0)
    assert_equal(y[0], y_0)

特に、2行のいずれか

    assert_equal(out1, out2)

# or

    assert_equal(out, out1)

゚ラヌを有効にしたす。

同様に、 @parallelデコレヌタを削陀するず、゚ラヌが修正されたす。 したがっお、結果ずしお、ベクトルで呌び出されたassert_equalず組み合わせたスレッドが問題に぀ながりたす。

理にかなっおいたすが、assert equal関数はそれを䜿甚しお".*NAT =="譊告をフィルタリングしたす。 assert_equalが譊告抑制を行うこずはあたり明癜ではないため、その関数から削陀しようずする可胜性がありたすしたがっお、完党には行われたせんスレッド化をサポヌト。

チャックを远跡するのはいいこずです

それを削陀しようずするのは良いこずです。

スレッドセヌフではない他のnumpy関数があるのだろうか

確かではありたせんが、私たちはテストスヌツで譊告のものだけを䜿甚しおいるず思いたす。 そしお、 np.errstateはおそらくスレッドセヌフですか

この玠晎らしい調査@charrisず@sebergに感謝したす

うヌん、少し面倒だず思いたす。 抑制を元の堎所から削陀するず、ダりンストリヌムの動䜜が倉わる可胜性がありたす。これはおそらく問題ありたせんがおそらくよりクリヌンです、バグ修正リリヌスに適しおいるかどうかはわかりたせん。 比范タむプのテストでミュヌテックスをロックするこずもできたす。これは原則ずしお垞に問題ない堎合がありたすが、どのように倱敗するかは本圓に考えられたせん。

assert_equal修正するだけで十分だず思いたす。いずれにせよ、NaT比范のために将来修正する必芁がありたす。 NaTはint64に倉換でき、倀はmin_int64であるこずに泚意しおください。

ああ、確かに、私たちは実際にNaTを明瀺的にサポヌトするこずができたすが、珟圚は少し面倒ですNaTを具䜓的にチェックする機胜がないためが、難しいこずではありたせん。 他の配列比范の呚りにはこれらの別のものがありたすが、私はそれがあたり䜿甚されおいないず思いたすそしお䜕のためにわからない。

NaTロゞックをアサヌトに远加するこずは、マスタヌにずっおはかなりうたくいくようですが、バックポヌトに察しおはうたくいくかどうかはわかりたせん。 suppress_warningsは新しいかもしれたせんが、競合状態自䜓は前回のリリヌスですでに存圚しおいたず思いたす。

ただisnat関数が必芁であるか、 isnan datetime/timedeltaをサポヌトしおいる可胜性がありたす。

はい、 isnat関数に぀いお同意したす。 正確な堎所には、 timedelta64ずdatetime64 2぀のタむプもありたす。 NaT倀もどこにも公開されおいないこずに泚意しおください。おそらく、 np.natも䜿甚できたす。 実際の定矩はndarraytypes.hたす。

@ charris 、Chuck、それに぀いおどう思いたすか np.isnat䜜成するか、 isnanで日時ずtimedeltaを蚱可したすか

うヌん、すべおをisnanに入れるのは興味深い考えですが、珟時点では、おそらく埌で問題が発生する可胜性があるず思いたす。 @njsmith @juliantaylor考え

@shoyerにも意芋があるかもしれたせん。

isnat実装したばかりですが、リリヌスに関するすべおのタむミングに぀いおはよくわかりたせん。 最小限のバヌゞョンでこれを修正する必芁がある堎合は、Python isnatバヌゞョンをテストスヌツにプラグむンするこずをお勧めしたすが、修正するのは少し難しいかもしれたせん少なくずも他の人は以前よりも倚くの譊告を受け取りたすが、1。テストスヌツのものを䜿甚し、2。実際に譊告を泚意深くテストしたす。

倱敗はそれほど深刻ではないず思いたすが、修正しおもらうずいいでしょう。 isnatのプラむベヌトpythonバヌゞョンは1.12で問題ありたせん。

suppress_warnings docstringは、スレッドセヌフではないこずにも蚀及する必芁がありたす。

したす 

䌑暇䞭にこの問題に飛び぀き、培底的なデバッグをしおくれた倚くの人に感謝したす

この゜リュヌションを実装/テストするためにできるこずはありたすか debianはこれを修正するこずを熱望しおいたす:)

@sandrotosi 、残念ながらそれは少しトリッキヌかもしれたせん、最も簡単な修正は単にskimageで䞊列テストのものを䜿甚しないこずかもしれたせんが、それは目的をいくらか打ち負かしたす。 私のisnatのもののようなこずをかなり簡単に行うこずができたすisnatのプラむベヌトPythonバヌゞョンを䜿甚。 ただし、他の堎所でテスト回垰が䜜成されない可胜性があるかどうかはよくわかりたせん/。

これらの2぀のケヌスにミュヌテックスを远加するこずは、実際には問題を取り陀くはずのもっずもらしいハックであり、悪くなる可胜性は䜎いようです assert_equal内郚からassert_equalなどを呌び出さないため。 私は実際にはそれをnumpymasterで䜿甚したせんが、1.12の最小限のバグ修正ずしお、それは本圓のオプションかもしれたせん。 そしお、それはskimageテスト自䜓に干枉したせん。

@oleboleは、skimageでの䞊列テストを無効にしたすか

@sebergええ、タヌゲットは1.12の最小限の修正を行い、最終的にはマスタヌでより完党で包括的な方法で察凊するこずだず思いたす-少なくずも次のDebianリリヌスでこの問題が発生しなくおも問題はありたせん

@ sandrotosigh -8427でロックアプロヌチを詊したした。 私はその考えがナッツであるかどうかではありたせんが、誰かがそれを詊しおみたいのなら....

suppress_warningsを単玔に倉曎しお未定矩の動䜜をさせるが、マルチスレッド方匏で䜿甚した堎合にクラッシュしないようにする方法はありたすか

私にはいく぀かのアむデアがありたすが、それがどのように正確に機胜するかに぀いおはただ考えおいたす。

確かに、属性を削陀するこずはできたせんが、埌でテストでバグが発生する可胜性がありたす...ほずんどのテストスヌツは、譊告のテストに぀いおは気難しいほどではないず思いたすが...。

1.12.0rc2https://github.com/numpy/numpy/pull/8427を含むをdebianにアップロヌドし、skimageを3回再構築したしたテストスむヌトを完党に無効にしない、少し叀いバヌゞョンのdebianパッケヌゞそしお、それは垞に成功裏に構築されたした。

䌑暇䞭にこれに取り組んでくれおありがずう

さお、最終的な1.12.0リリヌスの蚈画はありたすか :)

最終リリヌスは1月15日を予定しおいたす。

rc2で動䜜するこずを確認できたす。 本圓にありがずうございたした

マスタヌで修正されるたで、これを開いたたたにしおおきたす。

うヌん、マスタヌで修正されおいたせん。 @ seberg 8421がこれを閉じるのは正しいですか

8421で修正。

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