Evalml: Tes unit yang tidak stabil: paralel joblib ValueError

Dibuat pada 30 Okt 2019  ·  12Komentar  ·  Sumber: alteryx/evalml

Mengapa hasil kami untuk 3.6 dan 3.7 konsisten tetapi tidak 3.5?

bug

Semua 12 komentar

Masalah ini mungkin dapat ditangani dengan Dict() di 3.5 yang memiliki urutan penyisipan.

Kita harus menulis ringkasan di sini tentang apa yang tampaknya tidak konsisten

Sepertinya saya tidak dapat menemukan tiket lain tetapi masalah ini mungkin juga terkait/memperbaiki inkonsistensi CircleCI dengan paralelisasi di 3.5.

Kesalahan yang bisa muncul dapat ditemukan di sini .

Keren terima kasih.

Apa yang saya lihat di log adalah bahwa beberapa pengujian unit kami gagal pada python 3.5 tetapi masih meneruskan 3.6 dan 3.7.

Masalah ini mungkin dapat ditangani dengan Dict() di 3.5 yang memiliki urutan penyisipan.

Itu masuk akal.

Pertanyaan/tugas berikutnya:

  • Putuskan: seberapa pentingkah kami mendukung python 3.5 di evalml? ( @kmax12 : pikiran?)
  • Reproduksi ini secara lokal, debug, dan verifikasi akar masalahnya

Saya mulai mencari tahu ini.

Ringkasan : dapat melakukan repro tidak dapat diandalkan/kadang-kadang. Masih belum yakin dengan akar masalahnya.

Dari memilah-milah hasil CircleCI, sepertinya ini terjadi sebagian kecil dari waktu. Mungkin 10-20%.

Catatan: Saya mengajukan #311 untuk melacak beberapa pesan peringatan yang saya lihat di unit test. Mungkin terkait, tidak pasti.

Jejak tumpukan

evalml/tests/automl_tests/test_auto_regression_search.py:83:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
evalml/automl/auto_base.py:165: in search
    self._do_iteration(X, y, pbar, raise_errors)
evalml/automl/auto_base.py:261: in _do_iteration
    raise e
evalml/automl/auto_base.py:258: in _do_iteration
    score, other_scores = pipeline.score(X_test, y_test, other_objectives=self.additional_objectives)
evalml/pipelines/pipeline_base.py:257: in score
    y_predicted = self.predict(X)
evalml/pipelines/pipeline_base.py:205: in predict
    return self.estimator.predict(X_t)
evalml/pipelines/components/estimators/estimator.py:17: in predict
    return self._component_obj.predict(X)
test_python/lib/python3.5/site-packages/sklearn/ensemble/_forest.py:782: in predict
    for e in self.estimators_)
test_python/lib/python3.5/site-packages/joblib/parallel.py:1004: in __call__
    if self.dispatch_one_batch(iterator):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
...
>               islice = list(itertools.islice(iterator, big_batch_size))
E               ValueError: Stop argument for islice() must be None or an integer: 0 <= x <= sys.maxsize.

test_python/lib/python3.5/site-packages/joblib/parallel.py:808: ValueError

Beberapa kemungkinan

  • Bug dengan versi py3.5 dari hutan acak sklearn, yang menggunakan joblib.Parallel secara internal. Saya perhatikan jejak tumpukan sepertinya selalu menyebutkan baris test_python/lib/python3.5/site-packages/sklearn/ensemble/_forest.py:782 (yang, jika saya mendapatkan versi yang benar, ada di sini ). Versi sklearn yang digunakan oleh CircleCI untuk py3.5 adalah 0.22.1.
  • Mungkin wadah buruh pelabuhan entah bagaimana menghina joblib. Bingkai terakhir dalam jejak tumpukan ada dalam kode joblib

Barang yang saya coba I
Saya mengambil pekerjaan "linux python 3.5 unit test" yang gagal ini dan menggunakan "jalankan ulang dengan SSH" CircleCI (sangat berguna). Begitu masuk, saya mengaktifkan test_python venv dan menjalankan pytest cmd yang dipicu oleh make circleci-test

Saya mencoba menjalankan beberapa unit test yang gagal secara individual, tanpa hasil. Hanya ketika saya menjalankan semuanya sekaligus, saya dapat mengulangi beberapa kegagalan. Tetapi tes yang gagal berubah sedikit setiap kali dan tampaknya tidak dapat diprediksi.

Langkah selanjutnya

  • Pastikan bug ini sepadan dengan usaha: apakah kita akan terus mendukung python 3.5?
  • Untuk apa evalml estimator dan dataset kegagalan ini terjadi? Bisakah kita mengulangi ini dengan memanggil estimator secara langsung? Bagaimana dengan data lainnya?
  • Bisakah kita mengulangi ini di mac atau windows?
  • Terus mencoba repro andal. Mungkin menulis tes unit serupa yang membungkus hutan acak sklearn alih-alih memanggil evalml.

Bukan penyebabnya

  • Saya menemukan masalah online dengan ValueError yang 31 - 1 ke 2 63 - 1." Ini membuat saya bertanya-tanya apakah tesnya menggunakan python 32-bit. Saya memverifikasi bahwa kami menggunakan python 64-bit, jadi bukan itu.
  • Saya perhatikan kami menggunakan flag -n di pytest. Mungkin masalah ini mengekspos bug dalam cara pytest memutar pekerja paralel - tunggu, tidak apa-apa, karena tes ini gagal sebelum -n ditambahkan oleh Jeremy di cabangnya

dalam hal kebutuhan untuk mendukung 3.5...

saat ini 5-10% unduhan fitur alat kami berasal dari python 3.5. saya juga melihat beberapa perpustakaan terkait ml lainnya

scikit-belajar: ~10%
panda: 10-15%
xgboost: 20-30%
numpy: 10%

jadi, saya pikir ya, kita harus mencoba mendukungnya karena ada orang yang menggunakannya. jika mempertahankannya memperlambat kita secara drastis, kita bisa meninjaunya kembali.

checkout paket apa pun yang Anda inginkan di sini: https://pypistats.org/packages/pandas

Baru saja melihat contoh lain dari kegagalan ini pada PR saya, di sini . Itu belum hilang secara ajaib :) kita harus segera menggali ini

Kami menghapus dukungan untuk python 3.5 di #435.

Tapi perhatikan @ angela97lin menyebutkan dia melihat kegagalan ini pada python 3.6 Memperbarui nama masalah agar sesuai.

RE berkomentar di #435, saya ingin tahu apakah masalah ini ada hubungannya dengan penggunaan OrderedDict kami... mungkin tidak, hanya menambah daftar kemungkinan.

@ angela97lin apakah Anda memiliki info / tautan / repro dengan kegagalan 3.6 yang Anda lihat? Apakah itu lokal atau di circleci?

Tentu! Saya hanya mengalaminya melalui PR random_state saya untuk python 3.6, jadi saya sudah mencoba men-debug. Ini PR-nya: #431

Dari utas Slack:
Dugaan saya adalah itu harus melakukan sesuatu dengan n_jobs=-1 karena dalam jejak tumpukan, kami mendapatkan ValueError: Stop argument for islice() must be None or an integer: 0 <= x <= sys.maxsize. ; kemungkinan ketika n_jobs=-1, argumen stop yang diteruskan menjadi negatif dan memicu pengecualian ini. Kesalahan hilang ketika n_jobs bilangan bulat positif.

Inilah lari di mana saya mengalami ini: https://app.circleci.com/jobs/github/FeatureLabs/evalml/12366

Tampaknya hanya terjadi di CircleCI, jadi saya ingin tahu apakah itu ada hubungannya dengan masalah ini?

Status
Kami dapat mereproduksi ini di python 3.6 di @angela97lin 's PR #441. Kegagalan Circleci ada di sini . Kami tidak dapat melakukan repro dengan menjalankan tes individual, harus menjalankan semuanya.

Kami sebelumnya melihat kegagalan ini hanya pada python 3.5. Sekarang Angela mengutak-atik random_state menyebabkan ini gagal hanya pada python 3.6. Ini membuat saya berpikir ada kondisi balapan yang berkaitan dengan urutan panggilan ke generator nomor acak. Cukup membantu karena tampaknya gagal secara konsisten pada python 3.6 di cabang random_state Angela.

Langkah selanjutnya

  • Dylan memeriksa versi paket numpy/sklearn pada 3.6 vs 3.7, dan menggunakannya untuk memeriksa changelog mereka
  • Dylan mencoba untuk mendapatkan reproduksi lain, off master
  • Dylan mencoba menjalankan kembali semua tes di circleci melalui ssh, lihat apakah itu gagal
  • Dylan mencoba mengacaukan konfigurasi buruh pelabuhan di pekerjaan circleci, perbaikan potensial
    Dapat menambahkan sesuatu seperti berikut ( docker doc , circleci doc ) ke unit_tests circleci config untuk membatasi pekerjaan pengujian hingga 8 cpus:
    docker:
      - command: ['--cpuset', '0-7']
  • Angela mendapatkan #441 kembali ke keadaan di mana ini adalah satu-satunya tes yang gagal

Kita harus mengevaluasi kembali jika ini masih menjadi masalah sekarang setelah @christopherbunn bergabung #407

Saya belum melihat masalah ini sejak #407 digabungkan. Penutupan.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat