Numpy: في بعض الأحيان ، تفقد supress_warnings إحدى سماتها

تم إنشاؤها على ٢٣ ديسمبر ٢٠١٦  ·  60تعليقات  ·  مصدر: numpy/numpy

عند محاولة تجميع محتوى سريع ، أتلقى أحيانًا الخطأ التالي:

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 كومينتر

هممم ، غريب بعض الشيء. هل هناك بعض الخيوط (الغريبة) تجري في اختبارات الكشط؟ سيؤدي ذلك إلى كسر اختبار التحذير بشكل سيء للغاية ، نظرًا لأن التعامل مع التحذير ليس آمنًا في بيثون. أجد صعوبة في معرفة كيف يمكن أن يحدث هذا ، ولكن ربما ينبغي أن ننظر إلى الكود الدقيق الذي يتم تشغيله في الاختبار.

نظرًا لعدم وجود assert_warns أو هكذا أعتقد هنا. يجب أن يكون لديك سياق suppress_warnings واحد فقط على قيد الحياة (والذي سيكون النطاق الأبعد ويتم إنشاؤه بواسطة عداء اختبار numpy ، على افتراض أن الكشط ينتهي باستخدامه). الآن لماذا أشعر بالارتباك ، هو أن _orig_show لم يتم تعريفه يجب ألا يكون ممكنًا إلا إذا تم الخروج من السياق بالفعل. في ذلك الوقت ، يجب إعادة تعيين warnings.showwarning بالفعل إلى القيمة القديمة.

بالطبع تتعطل عناصر التحذيرات بأكملها إذا كان لديك خيوط. فمثلا:

thread1: يدخل سياق التحذير -> يستبدل الطباعة التحذيرية العادية
thread2: يدخل سياق التحذير -> يستبدل معالج التحذير thread1
thread1: يخرج من سياق التحذير -> يعيد التعيين إلى طباعة التحذير العادية
Thread2: يوجد سياق تحذيري -> يعيد تعيين معالج التحذير الخاص بـ thread1 -> kaboom.

بالمناسبة. أرى أن لديك "محاولة التنظيف بعد __warning_registry__ للأشياء في الكشط ، تحذيرات الإيقاف هي مدير سياق يحاول حل مشكلة مماثلة (ويضيف بعض الأشياء الأخرى) ، قد يكون أو لا يكون مثيرًا للاهتمام.

لقد واجهت المشكلة للتو عندما حاولت إنشاء عرض سريع لدبيان ، وليس لدي أي فكرة هنا. ومع ذلك ، فتحت scikit-image / scikit-image # 2412 لإشراكهم.

فقط من أجل الاكتمال: في بعض الأحيان ، أحصل على تتبع مكدس دون أي تدخل في الكشط:

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 ~ beta 1 و Python 2.7 و 3.5
(عذرًا ، خطئي: لم أفحص RC بعد)

حسنًا ، أنا في حيرة من أمري .... لا أستطيع أن أفهم سبب وجود مشكلات في مؤشر الترابط ، ولكن لا يمكنني أيضًا فهم حدوث هذا الخطأ دون وجود حالة سباق أو تداخل غير صحيح لـ catch_warning مثل الأشياء (بما في ذلك suppress_warning ).

أعتقد أيضًا أنها حالة عرقية ، لأنها لا تحدث دائمًا. يؤدي تشغيل الإنشاء مرتين في نفس البيئة تمامًا إلى ظهور المشكلة في أماكن مختلفة (أو حتى عدم ظهورها على الإطلاق).

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

xvfb-run موجود حيث يجب تشغيل الاختبار في بيئة X11.

Hmmmpf ، أي شخص يعرف ما يحدث بالضبط تحت غطاء المحرك عندما يبدأ الأنف في اختبار وحدة؟ الأنف يربكني ، ولا أستطيع أن أفهم لماذا ينتهي به الأمر إلى العبث بتحذيرات ... أو أنه خطأ في قمع التحذيرات بعد كل شيء ، لكن لا يمكنني رؤيته حقًا ، هيه.

في صفحة دليل nosetests الخاصة بي ، لدي

       --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]

يبدو أنه لا يوجد اختبار مواز بشكل افتراضي. على الأقل ، يجب ألا تكون حالة السباق موجودة.

هل هناك أي فرصة بعيدة أن يقوم الأنف بتشغيل هذا teardownContext بناءً على أشياء جمع القمامة ؟!

لا ، ربما أكون سخيفة. يعيد سياق تحذير الإيقاف تعيين warnings.showwarning قبل أن يحذف السمة ، لذا أشك حتى أن gc ketting in لا يمكنه فعلاً إنشاء أي شيء دون حدوث شيء آخر. ليس لدي فكرة ماذا بعد :).

حسنًا ، أرى 33 خطأً مع skimage-0.9.3 ، معظمها من PIL أو الفهرسة ، لكن لا شيء للقمع. كيف تتعامل مع كل الأخطاء الأخرى؟

charris تم الإبلاغ عن المشكلة لـ 0.12.3 وليس 0.9.3. :)

حسنًا ، لقد تم سحب هذا أخيرًا من أعلى التيار ، والآن 39 خطأ وكثير من الإهمال. يبدو أن معظم التحذيرات يرجع إلى حقيقة أن الاختبارات تعتقد أنها تعمل في QT بدلاً من Wayland ، قد تكون مشكلة في التكوين هنا. أحتاج أيضًا إلى إجراء الاختبارات كـ

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

لأن nosetests لا يعمل على الإطلاق.

الاستنكار أمر طبيعي. ما زلنا نتحقق من واجهة برمجة التطبيقات القديمة الخاصة بنا ، حتى إذا كان من المتوقع إيقاف العمل. حول الأخطاء ، هذا ليس طبيعيا. هل تمانع في الإبلاغ عنها على متتبع الأخطاء (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 .

بدافع الفضول ، أتساءل عما إذا كان هناك فرق في تحديد DeprecationWarning بشكل صريح بدلاً من استخدام UserWarning الافتراضي.

لذلك لا أرى أخطاء في

$ 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 وهذا يجعلني أشعر بالريبة.

حسنًا ، الآن أشك في مصمم الديكور test_parallel ، https://github.com/scikit-image/scikit-image/blob/master/skimage/_shared/testing.py . هذا الافتراضيات إلى اثنين من المواضيع.

إذا قمت بإزالة الملفات الثلاثة التي تستورد test_parallel ، فلم تعد هناك مشكلة.

تحرير: والآن لا يمكنني إعادة إنتاج المشكلة على الإطلاق. حسنًا ... ربما يعتمد أيضًا على ما يتم تشغيله على الجهاز.

حسنًا ، يمكن أن يكون 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)

في أي من السطرين

    assert_equal(out1, out2)

# or

    assert_equal(out, out1)

سيمكن الخطأ.

وبالمثل ، فإن إزالة مصمم الديكور @parallel يصلح الخطأ. لذا فالنتيجة هي أن الخيوط مع assert_equal استدعاؤها مع المتجهات تؤدي إلى المشكلة.

من المنطقي ، أن وظيفة التأكيد المتساوية تستخدمها لتصفية تحذيرات ".*NAT ==" ، ربما يمكننا محاولة إزالتها من هذه الوظيفة نظرًا لأنه ليس من الواضح حقًا أن assert_equal يقوم بالتحذير من القمع (وبالتالي لا يفعل ذلك بشكل كامل دعم الخيوط).

لطيفة تعقب تشاك!

محاولة إزالته سيكون شيئًا جيدًا.

أتساءل عما إذا كانت هناك وظائف أخرى غير آمنة للخيط؟

لست متأكدًا ، أعتقد أننا نستخدم فقط عناصر التحذير في بدلة الاختبار. و np.errstate ربما يكون موضوعًا آمنًا؟

شكرًا جزيلاً على هذا التحقيق الجميل charris و seberg

هممم ، أجده مزعجًا بعض الشيء. قد تؤدي إزالة عمليات القمع من مكانها إلى تغيير سلوك المصب ، ومن المحتمل أن يكون ذلك جيدًا (ربما أكثر نظافة) ، ولكن لست متأكدًا من أنه مفيد لإصدار إصلاح الأخطاء. يمكن أيضًا قفل كائن المزامنة في اختبارات نوع المقارنة ، والذي قد لا يكون دائمًا جيدًا من حيث المبدأ ، لكن لا يمكنني التفكير حقًا في كيفية كسره.

أعتقد أنه سيكون كافيًا فقط إصلاح assert_equal ، سيحتاج إلى إصلاح في المستقبل لمقارنة NaT في أي حال. لاحظ أنه يمكن تحويل NaT إلى int64 وله قيمة min_int64.

أوه ، صحيح ، يمكننا في الواقع دعم NaT بشكل صريح ، وهو أمر مزعج بعض الشيء حاليًا (نظرًا لعدم وجود وظيفة للتحقق من NaT على وجه التحديد) ، ولكن ليس صعبًا. هناك شيء آخر من هذه الأشياء حول مقارنات المصفوفات الأخرى ، لكنني أعتقد أنها لم تستخدم كثيرًا (ولست متأكدًا من أي شيء).

يبدو أن إضافة منطق NaT إلى التأكيدات تعمل بشكل جيد مع السيد ، على الرغم من أنني لست متأكدًا من أنها ستعمل من أجل backporting. أعتقد أنه على الرغم من أن suppress_warnings قد يكون جديدًا ، إلا أن حالة السباق نفسها كانت موجودة بالفعل في الإصدار الأخير.

ما زلنا بحاجة إلى وظيفة isnat أو ربما ندعم datetime/timedelta في isnan .

نعم ، توافق على وظيفة isnat . يوجد أيضًا نوعان من أنواع الأكور: timedelta64 و datetime64 . لاحظ أن قيمة NaT لا تظهر في أي مكان أيضًا ، فمن المحتمل أن نستخدم np.nat أيضًا. التعريف الفعلي هو ndarraytypes.h .

charris ، تشاك ، ما رأيك في ذلك ، بدلاً من إنشاء np.isnat أو بالأحرى السماح بالتاريخ والوقت في isnan ؟

حسنًا ، وضع كل شيء في isnan هو فكرة مثيرة للاهتمام ولكني أظن أنه قد يسبب مشكلة في هذا الوقت ، ربما لاحقًا؟ njsmithjuliantaylor أفكار؟

shoyer قد يكون لها رأي أيضًا.

لقد قمت للتو بتطبيق isnat ، لكنني لست متأكدًا من كل عناصر التوقيت فيما يتعلق بالإصدار. إذا كان علينا محاولة إصلاح هذا في إصدار بسيط ، فمن المحتمل أن يكون الخيار الأفضل هو توصيل إصدار python isnat في بدلة الاختبار ، على الرغم من أن إصلاحه قد يكون صعبًا بعض الشيء في أي حال ( على الأقل ، سيحصل الآخرون على المزيد من التحذيرات من قبل ، على الرغم من قلة هذه التحذيرات. 1. استخدم بدلات الاختبار الخاصة بنا و 2. في الواقع اختبر التحذيرات بعناية).

لا أعتبر الفشل شديد الخطورة ولكن سيكون من الجيد إصلاحه. إصدار بيثون (خاص؟) من isnat سيكون مناسبًا لي لـ 1.12.

يجب أن يذكر docstring suppress_warnings أنه ليس مؤشر ترابط آمن.

نعم هو كذلك :)

شكرًا جزيلاً يا رفاق على القفز على هذه المشكلة أثناء العطلات وعلى التصحيح الشامل

هل هناك أي شيء يمكنني القيام به لتنفيذ / اختبار حل لهذا؟ ديبيان حريص على إصلاح هذا :)

sandrotosi ، لسوء الحظ ، قد يكون الأمر صعبًا بعض الشيء ، فقد يكون أبسط حل هو ببساطة عدم استخدام عناصر الاختبار الموازية في skimage ، لكن هذا إلى حد ما يهزم الغرض. يمكننا بكل بساطة أن نفعل شيئًا مثل ما في isnat الخاص بي (باستخدام إصدار python خاص من isnat). ومع ذلك ، لست متأكدًا تمامًا من أنه قد لا يؤدي إلى حدوث تراجع في الاختبار في مكان آخر: /.

قد تكون إضافة كائن المزامنة (mutex) لهاتين الحالتين في الواقع اختراقًا معقولًا يجب أن يزيل المشكلة ويبدو من غير المحتمل أن يفسد (نظرًا لأنك لن تتصل بـ assert_equal أو ما شابه ذلك من داخل assert_equal ). لن أستخدم ذلك في الواقع في numpy master ، ولكن كحد أدنى من إصلاح الأخطاء لـ 1.12 قد يكون خيارًا حقيقيًا. ولن تتداخل مع اختبارات الكشط نفسها.

olebole هل سيعطل الاختبار المتوازي في skimage يكون حلاً مؤقتًا مقبولاً؟

seberg ، نعم ، أعتقد أن الهدف قد يكون الحصول على إصلاح

sandrotosi حاولت نهج القفل في gh-8427. أنا لا أفكر سواء كان الفكر مجنونًا أم لا ، ولكن إذا أراد شخص ما تجربته ...

هل هناك طريقة ما يمكننا من خلالها ببساطة تعديل suppress_warnings للحصول على سلوك غير محدد ولكن لا يتعطل عند استخدامه بطريقة متعددة الخيوط؟

(لدي بعض الأفكار ، لكنني ما زلت أفكر في كيفية عملها بالضبط).

بالتأكيد ، لا يمكننا حذف السمة ، ولكنها قد تخلق أخطاءً في الاختبارات لاحقًا ... على الرغم من أنني أعتقد أن معظم بدلات الاختبار ليست صعبة مثل numpy حول اختبار التحذيرات ، لذا ...

لقد قمت بتحميل 1.12.0rc2 (الذي يحتوي على https://github.com/numpy/numpy/pull/8427) إلى debian وأعدت إنشاء سكيمج 3 مرات (إصدار قديم قليلاً من حزمة دبيان ، بدون تعطيل مجموعة الاختبار تمامًا) وكل الأوقات التي بُنيت فيها بنجاح.

شكرًا جزيلاً يا رفاق على العمل على هذا خلال العطلات!

الآن ، أي خطط لإصدار 1.12.0 النهائي؟ :)

أخطط لتقديم الإصدار النهائي في 15 يناير.

أستطيع أن أؤكد أنه يعمل مع rc2. شكرا جزيلا لجهودكم لك!

سأترك هذا مفتوحًا حتى يتم إصلاحه في الماجستير.

حسنًا ، ليس ثابتًا في الماجستير. seberg هل صحيح أن # 8421 سيغلق هذا؟

تم الإصلاح بواسطة # 8421.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات