Saya sedang mengerjakan proyek ilmu data menggunakan Python. Proyek ini memiliki beberapa tahap. Setiap tahap terdiri dari pengambilan set data, menggunakan skrip Python, data tambahan, konfigurasi dan parameter, dan membuat set data lain. Saya menyimpan kode di git, sehingga bagian itu tertutup. Saya ingin mendengar tentang:
- Alat untuk kontrol versi data.
- Alat yang memungkinkan untuk mereproduksi tahap dan percobaan.
- Protokol dan struktur direktori yang disarankan untuk proyek semacam itu.
- Alat bantu build / run otomatis.
python
tools
version-control
Yuval F
sumber
sumber
Jawaban:
Topik penelitian direproduksi (RR) sangat populer saat ini dan, oleh karena itu, sangat besar , tetapi saya berharap jawaban saya akan cukup komprehensif sebagai jawaban dan akan memberikan informasi yang cukup untuk penelitian lebih lanjut , jika Anda memutuskan untuk melakukannya.
Meskipun alat khusus Python untuk RR tentu ada di luar sana, saya pikir lebih masuk akal untuk fokus pada alat yang lebih universal (Anda tidak pernah tahu pasti bahasa pemrograman dan lingkungan komputasi yang akan Anda gunakan di masa mendatang). Karena itu, mari kita lihat alat apa yang tersedia per daftar Anda.
1) Alat untuk kontrol versi data . Kecuali Anda berencana untuk bekerja dengan data besar (sangat) , saya kira, masuk akal untuk menggunakan hal yang sama
git
, yang Anda gunakan untuk kontrol versi kode sumber. Infrastrukturnya sudah ada. Sekalipun file Anda berukuran biner dan besar, saran ini mungkin bermanfaat: https://stackoverflow.com/questions/540535/manajemen-large-binary-files-with-git .2) Alat untuk mengelola alur kerja dan eksperimen RR . Berikut daftar alat paling populer dalam kategori ini, sepengetahuan saya (menurut urutan popularitas):
Sistem Manajemen Alur Kerja Taverna ( http://www.taverna.org.uk ) - sangat solid, jika sedikit terlalu rumit, seperangkat alat. Alat utama adalah perangkat lunak desktop berbasis Java. Namun, ini kompatibel dengan portal repositori alur kerja online myExperiment ( http://www.myexperiment.org ), di mana pengguna dapat menyimpan dan berbagi alur kerja RR mereka. Portal RR berbasis web, sepenuhnya kompatibel dengan Taverna disebut Taverna Online , tetapi sedang dikembangkan dan dikelola oleh organisasi yang sama sekali berbeda di Rusia (disebut di sana sebagai OnlineHPC : http://onlinehpc.com ).
Proyek Kepler ( https://kepler-project.org )
VisTrails ( http://vistrails.org )
Madagaskar ( http://www.reproducibility.org )
CONTOH . Berikut adalah artikel menarik tentang alur kerja ilmiah dengan contoh desain alur kerja nyata dan analisis data, berdasarkan penggunaan proyek Kepler dan myExperiment : http://f1000research.com/articles/3-110/v1 .
Ada banyak alat RR yang menerapkan paradigma pemrograman melek , yang dicontohkan oleh
LaTeX
keluarga perangkat lunak. Alat yang membantu dalam pembuatan laporan dan presentasi juga merupakan kategori besar, di manaSweave
danknitr
mungkin merupakan yang paling terkenal.Sweave
adalah alat, fokus pada R, tetapi dapat diintegrasikan dengan proyek berbasis Python, meskipun dengan beberapa upaya tambahan ( https://stackoverflow.com/questions/2161152/sweave-for-python ). Saya pikir ituknitr
mungkin pilihan yang lebih baik, karena modern, memiliki dukungan luas oleh alat-alat populer (sepertiRStudio
) dan bahasa-netral ( http://yihui.name/knitr/demo/engines ).3) Protokol dan struktur direktori yang disarankan . Jika saya mengerti benar apa yang Anda maksudkan dengan menggunakan istilah protokol ( alur kerja ), umumnya saya berpikir bahwa alur kerja analisis data RR standar terdiri dari fase berurutan berikut: pengumpulan data => persiapan data (pembersihan, transformasi, penggabungan, pengambilan sampel) => analisis data => presentasi hasil (menghasilkan laporan dan / atau presentasi). Namun demikian, setiap alur kerja adalah spesifik proyek dan, karenanya, beberapa tugas tertentu mungkin memerlukan penambahan langkah-langkah tambahan.
Untuk struktur direktori contoh, Anda dapat melihat dokumentasi untuk paket R
ProjectTemplate
( http://projecttemplate.net ), sebagai upaya untuk mengotomatisasi alur kerja dan proyek analisis data:4) Alat bantu build / run otomatis . Karena jawaban saya difokuskan pada alat RR universal (bahasa-netral), alat yang paling populer adalah
make
. Baca artikel berikut karena beberapa alasan untuk digunakanmake
sebagai alat otomatisasi alur kerja RR yang disukai: http://bost.ocks.org/mike/make . Tentu saja, ada alat serupa lainnya , yang dapat meningkatkan beberapa aspekmake
, atau menambahkan beberapa fitur tambahan. Misalnya:ant
(secara resmi, Apache Ant: http://ant.apache.org ),Maven
("generasi berikutnyaant
": http://maven.apache.org ),rake
( https://github.com/ruby/rake ) ,Makepp
( http://makepp.sourceforge.net). Untuk daftar lengkap alat tersebut, lihat Wikipedia: http://en.wikipedia.org/wiki/List_of_build_automation_software .sumber
Sejak saya mulai melakukan penelitian di dunia akademis, saya terus mencari alur kerja yang memuaskan. Saya pikir akhirnya saya menemukan sesuatu yang saya sukai:
1) Letakkan semuanya di bawah kontrol versi, misalnya, Git:
Untuk proyek penelitian hobi saya menggunakan GitHub, untuk penelitian di tempat kerja saya menggunakan server GitLab pribadi yang disediakan oleh universitas kami. Saya juga menyimpan set data saya di sana.
2) Saya melakukan sebagian besar analisis saya bersama dengan dokumentasi pada notebook IPython. Sangat terorganisir (bagi saya) untuk memiliki kode, plot, dan diskusi / kesimpulan semua dalam satu dokumen. Jika saya menjalankan skrip yang lebih besar, saya biasanya akan menempatkan mereka ke dalam file skrip terpisah .py file, tetapi saya masih akan menjalankannya dari notebook IPython melalui% run magic untuk menambahkan informasi tentang tujuan, hasil, dan parameter lainnya.
Saya telah menulis ekstensi sel kecil sihir untuk notebook IPython dan IPython, yang disebut "watermark" yang saya gunakan untuk membuat perangko waktu dan melacak berbagai versi paket yang saya gunakan dan juga hash Git
Sebagai contoh
Untuk info lebih lanjut, lihat dokumentasi di sini .
sumber
Alat reproduksibilitas terbaik adalah membuat log tindakan Anda, sesuatu seperti ini:
Ini dapat ditulis di atas kertas, tetapi, jika percobaan Anda sesuai dengan kerangka kerja komputasi, Anda dapat menggunakan alat komputasi untuk mengotomatiskan sebagian atau seluruh proses logging (terutama dengan membantu Anda melacak dataset input yang bisa sangat besar, dan hasilnya angka).
Alat reproduksibilitas hebat untuk Python dengan kurva belajar yang rendah tentu saja adalah IPython / Jupyter Notebook (jangan lupa % logon dan% logstart magics ). Kiat: untuk memastikan notebook Anda dapat direproduksi, restart kernel dan coba jalankan semua sel dari atas ke bawah (tombol Jalankan Semua Sel): jika berfungsi, maka simpan semuanya dalam file arsip ("beku"), jika tidak, terutama jika Anda perlu menjalankan sel dengan cara yang tidak linier dan tidak berurutan dan tidak jelas untuk menghindari kesalahan, Anda perlu mengerjakan ulang sedikit.
Alat hebat lain yang sangat baru (2015) adalah recipy , yang sangat mirip dengan sumatra (lihat di bawah), tetapi dibuat khusus untuk Python. Saya tidak tahu apakah itu berfungsi dengan Notebook Jupyter, tapi saya tahu penulis sering menggunakannya jadi saya kira jika itu saat ini tidak didukung, itu akan di masa depan.
Git juga luar biasa, dan tidak terikat dengan Python. Ini akan membantu Anda tidak hanya untuk menyimpan riwayat semua percobaan, kode, kumpulan data, angka, dll. Tetapi juga memberi Anda alat untuk memelihara ( git pickaxe ), berkolaborasi ( menyalahkan ) dan men-debug ( git - bisect ) menggunakan ilmiah metode debugging (disebut delta debugging ). Berikut ini adalah kisah seorang peneliti fiksi yang mencoba membuat eksperimennya sendiri dengan sistem logging, hingga akhirnya menjadi faksimili Git.
Alat umum lain bekerja dengan bahasa apapun (dengan API Python pada pypi ) adalah Sumatera , yang dirancang khusus untuk membantu Anda melakukan ditiru penelitian ( direplikasi bertujuan untuk menghasilkan hasil yang sama diberikan persis kode yang sama dan software, sedangkan reproduksi bertujuan untuk menghasilkan hasil yang sama diberikan media apa pun, yang jauh lebih sulit dan memakan waktu dan tidak dapat diautomatisasi).
Inilah cara kerja Sumatera: untuk setiap percobaan yang Anda lakukan melalui Sumatera, perangkat lunak ini akan bertindak seperti "save game state" yang sering ditemukan di videogame. Lebih tepatnya, itu akan menghemat:
Kemudian akan membangun database dengan stempel waktu dan metadata lainnya untuk setiap percobaan Anda, yang nantinya dapat Anda jelajahi menggunakan webGUI. Karena Sumatra menyimpan status penuh aplikasi Anda untuk percobaan tertentu pada satu titik waktu tertentu, Anda dapat mengembalikan kode yang menghasilkan hasil spesifik kapan saja Anda inginkan, sehingga Anda memiliki penelitian yang dapat ditiru dengan biaya rendah (kecuali untuk penyimpanan jika Anda bekerja pada kumpulan data besar, tetapi Anda dapat mengonfigurasi pengecualian jika Anda tidak ingin menyimpan semuanya setiap kali).
Alat luar biasa lainnya adalah Zeitgeist GNOME (sebelumnya dikodekan dengan Python tetapi sekarang porting ke Vala), sebuah sistem penjurnalan tindakan semua-kompas, yang mencatat semua yang Anda lakukan dan dapat menggunakan pembelajaran mesin untuk meringkas untuk periode waktu yang Anda inginkan hubungan antar item berdasarkan pada kesamaan dan pola penggunaan, misalnya menjawab pertanyaan seperti "Apa yang paling relevan bagi saya, ketika saya sedang mengerjakan proyek X, selama satu bulan tahun lalu?" . Yang menarik, Zim Desktop Wiki , aplikasi pencatat yang mirip dengan Evernote, memiliki plugin untuk bekerja dengan Zeitgeist.
Pada akhirnya, Anda dapat menggunakan Git atau Sumatra atau perangkat lunak lain yang Anda inginkan, mereka akan memberi Anda kekuatan replikasi yang sama, tetapi Sumatra secara khusus dirancang untuk penelitian ilmiah sehingga ia menyediakan beberapa alat mewah seperti GUI web untuk dijelajahi hasil Anda, sementara Git lebih disesuaikan dengan pemeliharaan kode (tetapi memiliki alat debugging seperti git-membagi sehingga jika percobaan Anda melibatkan kode, itu sebenarnya mungkin lebih baik). Atau tentu saja Anda bisa menggunakan keduanya!
/ EDIT: dsign menyentuh poin yang sangat penting di sini: replikasi pengaturan Anda sama pentingnya dengan replikasi aplikasi Anda. Dengan kata lain, Anda setidaknya harus memberikan daftar lengkap pustaka dan kompiler yang Anda gunakan beserta versi tepatnya dan perincian platform Anda .
Secara pribadi, dalam komputasi ilmiah dengan Python, saya telah menemukan bahwa mengemas aplikasi bersama dengan perpustakaan terlalu menyakitkan, jadi saya sekarang hanya menggunakan paket python ilmiah all-in-one seperti Anaconda (dengan conda pengelola paket hebat ), dan hanya menyarankan pengguna untuk menggunakan paket yang sama. Solusi lain dapat dengan menyediakan skrip untuk secara otomatis menghasilkan virtualenv , atau untuk mengemas segala sesuatu menggunakan aplikasi Docker komersial seperti dikutip oleh dsign atau opensource Vagrant (dengan misalnya pylearn2-in-a-box yang menggunakan Vagrant untuk menghasilkan distribusi yang mudah didistribusikan kembali paket lingkungan virtual).
Akhirnya, untuk benar-benar memastikan bahwa Anda memiliki lingkungan yang berfungsi penuh setiap kali Anda butuhkan, Anda dapat membuat mesin virtual (lihat VirtualBox), dan Anda bahkan dapat menyimpan keadaan mesin (snapshot) dengan eksperimen yang siap dijalankan di dalam. Lalu, Anda bisa membagikan mesin virtual ini dengan semua yang disertakan sehingga siapa pun dapat mereplikasi percobaan Anda dengan pengaturan yang tepat. Ini mungkin cara terbaik untuk mereplikasi eksperimen berbasis perangkat lunak. Kontainer mungkin merupakan alternatif yang lebih ringan, tetapi mereka tidak termasuk seluruh lingkungan, sehingga kesetiaan replikasi akan menjadi kurang kuat.
/ EDIT2: Berikut adalah ringkasan video yang hebat (untuk debugging tetapi ini juga dapat diterapkan untuk penelitian) apa yang mendasar untuk melakukan penelitian yang dapat direproduksi: mencatat percobaan Anda dan setiap langkah lain dari metode ilmiah, semacam "eksperimen eksplisit" .
sumber
Pastikan untuk memeriksa buruh pelabuhan ! Dan secara umum, semua hal baik lainnya yang telah diciptakan rekayasa perangkat lunak selama beberapa dekade untuk memastikan isolasi dan reproduktifitas.
Saya ingin menekankan bahwa tidak cukup hanya memiliki alur kerja yang dapat direproduksi, tetapi juga mudah untuk mereproduksi alur kerja. Biarkan saya menunjukkan apa yang saya maksud. Misalkan proyek Anda menggunakan Python, database X dan Scipy. Paling pasti Anda akan menggunakan perpustakaan tertentu untuk terhubung ke database Anda dari Python, dan Scipy pada gilirannya akan menggunakan beberapa rutin aljabar. Ini tentu saja merupakan pengaturan yang sangat sederhana, tetapi tidak sepenuhnya sederhana untuk pengaturan, pun dimaksudkan. Jika seseorang ingin mengeksekusi skrip Anda, ia harus menginstal semua dependensi. Atau lebih buruk lagi, dia mungkin sudah menginstal versi yang tidak kompatibel. Memperbaiki hal-hal itu membutuhkan waktu. Ini juga akan memakan waktu bagi Anda jika suatu saat Anda perlu memindahkan perhitungan Anda ke sebuah cluster, ke sebuah cluster yang berbeda, atau ke beberapa server cloud.
Di sinilah saya menemukan buruh pelabuhan berguna. Docker adalah cara untuk memformalkan dan menyusun resep untuk lingkungan biner. Anda dapat menulis yang berikut ini di dockerfile (saya menggunakan bahasa Inggris di sini bukan sintaks Dockerfile):
Beberapa baris akan menginstal hal-hal di Python menggunakan pip, karena pip dapat melakukan pekerjaan yang sangat bersih dalam memilih versi paket tertentu. Lihat juga!
Dan itu saja. Jika setelah Anda membuat Dockerfile Anda dapat dibangun, maka itu dapat dibangun di mana saja, oleh siapa saja (asalkan mereka juga memiliki akses ke file spesifik proyek Anda, misalnya karena Anda meletakkannya di url publik yang dirujuk dari Dockerfile). Apa yang terbaik, Anda dapat mengunggah lingkungan yang dihasilkan (disebut "gambar") ke server publik atau pribadi (disebut "daftar") untuk digunakan orang lain. Jadi, ketika Anda mempublikasikan alur kerja Anda, Anda memiliki resep yang sepenuhnya dapat direproduksi dalam bentuk Dockerfile, dan cara mudah bagi Anda atau orang lain untuk mereproduksi apa yang Anda lakukan:
Atau jika mereka ingin melihat-lihat skrip Anda dan sebagainya:
sumber
Sayangnya, saya tidak memiliki poin reputasi yang cukup untuk menjawab posting oleh Plank, jadi harus menjawab seluruh utas - maaf tentang itu.
Saya sebenarnya adalah pengembang Kerangka Pengetahuan Kolektif open-source yang disebutkan di atas. Ia mencoba untuk menyederhanakan berbagi artefak dan alur kerja eksperimental sebagai komponen Python yang dapat digunakan kembali dan direproduksi dengan API JSON terpadu dan meta JSON yang dibagikan melalui GitHub. Mereka juga dapat dihubungkan ke analitik prediktif dengan API JSON terpadu yang sama.
Kami baru saja merilis versi baru V1.8.1 dan menyediakan dokumentasi yang luas sehingga mudah-mudahan akan lebih mudah untuk memahami konsep sekarang: http://github.com/ctuning/ck/wiki
Kami sekarang memiliki banyak proyek akademik dan industri berdasarkan kerangka kerja ini, jadi Anda dapat memeriksa salah satunya - optimalisasi program crowdsourcing di seluruh perangkat seluler yang disediakan oleh sukarelawan dengan cara yang dapat direproduksi: http://cknowledge.org/repo
Kami juga melacak berbagai sumber yang terkait dengan ilmu yang dapat direproduksi di sini: https://github.com/ctuning/ck/wiki/Enabling-open-science
Meskipun saya terutama berfokus pada membuat penelitian sistem komputer dapat direproduksi, saya memiliki obrolan yang menarik dengan kolega dari domain lain dan sepertinya mereka memiliki masalah yang sangat mirip. Jadi, saya akan sangat senang jika kerangka kerja kami dapat membantu komunitas lain! Jika Anda memiliki pertanyaan atau saran, silakan menghubungi kami!
sumber
Ada seluruh program yang dikhususkan untuk penelitian yang dapat direproduksi. https://www.coursera.org/learn/reproducible-research Kursus ini didasarkan pada R, tetapi ide yang mendasarinya dapat dipelajari.
Salah satu cara sederhana adalah dengan memiliki notebook Ipython dan tetap menyimpan setiap pekerjaan kotor yang Anda lakukan, baik itu membersihkan data, analisis eksplorasi atau membangun model.
sumber
Baru-baru ini saya menemukan alat berikut - http://github.com/ctuning/ck . Itu sudah ditulis dalam Python dan tampaknya termasuk apa yang Anda butuhkan (kolega saya menggunakannya dalam proyek percontohan untuk mengotomatiskan pengenalan gambar).
Pro:
Kekurangan:
sumber
Saya telah membuat dan baru-baru ini merilis alat open source http://dvc.org atau DVC yang melakukan persis apa yang Anda coba jangkau:
dvc repro data/scores.csv
Mereproduksi semua langkah yang diperlukan terkait DAG.data
secara default) tempat Anda seharusnya menyimpan semua file data. Namun, DVC secara transparan memindahkan konten aktual ke.cache
direktori dan membuat symlink (ya, saya membuatnya bekerja di Windows juga). The.cache
direktori tidak disinkronisasikan ke Git tetapi dapat disinkronkan melalui awan (S3 atau GCP) dengan perintahdvc sync data/scores.csv
(itu syncs berkorespondensi data file dari cache seperti.cache/scores.csv_29de545
)DVC tutorial adalah titik awal yang baik - "Kontrol Versi Data: pembelajaran mesin iteratif" .
sumber
PENOLAKAN: Saya bekerja di sebuah perusahaan, Datmo , yang menciptakan alat sumber terbuka untuk melakukan ini.
Praktik terbaik untuk reproduksibilitas adalah sebagai berikut:
1) Pertama kemas lingkungan Anda ke dalam lingkungan Docker dengan membuat Dockerfile dan memastikan bahwa semua dependensi tercakup dalam file itu. Saya menemukan sumber ini sebagai yang terbaik ( https://arxiv.org/pdf/1410.0846.pdf )
2) Setelah Anda memilikinya, Anda akan ingin memutuskan di mana Anda dapat melacak semua metrik kinerja dan konfigurasi (sehingga Anda dapat mengunjungi kembali untuk eksperimen selanjutnya)
3) Akhirnya, tulis beberapa dokumentasi sehingga eksperimen / pengembang baru dapat meninjau kembali kode Anda, menyalinnya dengan lingkungan dan melihat di mana Anda menyimpan konfigurasi dan metrik kinerja Anda.
sumber