
Hanya sedikit orang yang percaya bahwa tumpukan ilmu data modern dapat dibangun bukan dengan Python, tetapi ada preseden seperti itu :). Tumpukan Odnoklassniki dibentuk selama bertahun-tahun, terutama oleh programmer yang beralih ke ilmu data, tetapi masih tetap dekat dengan produk, sehingga didasarkan pada teknologi terbuka tumpukan JVM: Hadoop, Spark, Kafka, Cassandra, dll. Ini membantu kami mengurangi waktu dan biaya untuk menjalankan model, tetapi kadang-kadang hal itu menimbulkan kesulitan. Misalnya, ketika menyiapkan solusi dasar untuk peserta SNA Hackathon 2019 , mereka harus mengompresi tekad mereka dan terjun ke dunia pengetikan dinamis. Detail (dan trolling mudah) di bawah cut :)
Instalasi

Ada beberapa jenis python di hampir semua mesin pengembangan. Dia ditemukan di tambang, sudah dalam rangkap - 2.7 dan 3.4. Setelah mencari-cari di tempat memori, saya ingat bahwa saya menginstal versi 3.4 tiga tahun lalu, setelah para peserta menghadapi masalah epik di SNA Hackathon 2016, mencoba untuk memperluas grafik setengah gigabyte dalam memori (sebagai hasil dari video pelatihan kecil dan kompetisi terpisah ), tetapi hari ini adalah ekonomi sudah usang secara moral dan perlu diperbarui.
Di dunia Jawa, setiap proyek selama pertemuan menunjukkan semua yang ingin dimasukkan ke dalam dirinya sendiri, dan terus berlanjut dengan ini. Secara teori, semuanya sederhana dan indah, tetapi dalam praktiknya, ketika Anda membutuhkan pustaka A dan pustaka B, pasti keduanya akan membutuhkan pustaka C, dengan dua versi yang tidak kompatibel :). Dalam upaya yang sia-sia untuk memutus lingkaran setan ini, beberapa perpustakaan mengemas semua dependensinya dalam diri mereka sendiri dan bersembunyi dari yang lain, sementara sisanya berputar semampu mereka.
Ada apa dengan python ini? Tidak ada proyek seperti itu, tetapi ada "lingkungan", dan dalam setiap lingkungan, ekosistem independen dapat dibentuk dari paket versi tertentu. Pada saat yang sama, ada alat untuk malas , dengan bantuan yang tidak lebih sulit untuk mengelola lingkungan Python lokal, daripada cluster heterogen yang didistribusikan Clauder atau Horton. Tetapi konflik timbal balik antara versi paket tidak akan terjadi di mana-mana. Saya segera dihadapkan dengan kenyataan bahwa rilis Pandas 0.24 mengalihkan metode _maybe_box_datetimelike pribadi ke API publik, dan tiba-tiba ternyata banyak orang telah menggunakannya dalam bentuk sebelumnya dan sekarang jatuh :) (dan ya, di Dunia Jawa adalah sama ). Tetapi pada akhirnya, semuanya diperbaiki, terlepas dari peringatan mengerikan tentang depriycheyshin baru, itu berhasil.
Garis dasar kolaboratif

Tugas-tugas di SNA Hackathon 2019 dibagi menjadi tiga area - rekomendasi untuk log, teks dan gambar. Mari kita mulai dengan log (spoiler - megapattern Cmd + C / Cmd + V dengan stackoverflow juga berfungsi dengan python). Data dikumpulkan dari produksi langsung - setiap pengguna secara acak, tanpa menimbang, ditunjukkan beberapa umpan dari lingkungannya, setelah semua tanda pada saat pertunjukan dan reaksi akhir dicatat dalam log. Sepotong tugas kue: kita mengambil tanda, kita mendorong logg , untung!
Tetapi rencana itu terlintas pada tahap pertama, saat membaca data. Secara teori, ada paket Apache Arrow yang luar biasa, yang seharusnya menyatukan pekerjaan dengan data dalam ekosistem yang berbeda dan, khususnya, untuk memungkinkan membaca file "parket" dari python tanpa percikan. Dalam praktiknya, ternyata. bahwa bahkan dengan membaca struktur bersarang sederhana ia memiliki masalah , dan hierarki kita yang indah telah berubah menjadi kemelaratan datar :(.
Tetapi ada aspek-aspek positif. Jupyter , secara umum, senang, itu hampir sama nyamannya, meskipun tidak secantik Zeppelin . Bahkan ada inti batu ! Nah, kecepatan regresi logistik pada sepotong kecil data dalam memori senang - itu tidak mencapai kekuatan opsi yang didistribusikan, tetapi belajar langsung pada empat tanda dan beberapa ratus ribu contoh.
Namun, kemudian, antusiasme yang muncul terpukul keras: jika transformasi data yang diperlukan (kelompok dengan kunci dan berkumpul ke dalam daftar) tidak ada dalam daftar standar dan berlaku atau peta muncul, maka kecepatan turun berdasarkan urutan besarnya. Akibatnya, 80% dari waktu baseline tidak membaca data, bergabung, pelatihan model dan penyortiran, tetapi kompilasi dangkal dari daftar.
By the way, justru karena fitur ini saya selalu terkejut dengan pengguna pySpark - setelah semua, hampir semua fungsi standar tersedia dalam bentuk Spark SQL, yang sama dalam python dan rock, dan setelah python-seperti yudf-in pertama dengan sesuatu yang personal seperseribu ribu cluster berubah menjadi labu ...
Tapi, pada akhirnya, semua rintangan diatasi dan sembilan poin sudah cukup untuk skor 0,65!
Garis dasar teks

Nah, sekarang tugas kita lebih rumit - jika logreg dapat ditemukan dalam ratusan implementasi untuk semua platform, maka ada lebih banyak variasi alat untuk bekerja dengan teks di bawah python. Untungnya, teks sudah dikirim tidak hanya dalam bentuk mentah, tetapi juga diproses oleh sistem preprocessing reguler kami yang didasarkan pada Spark dan Lucene . Karena itu, Anda dapat segera mengambil daftar token dan tidak khawatir tentang tokenization / lematization / stemming.
Untuk beberapa waktu saya ragu harus mengambil apa: BigARTM domestik atau Gensim impor. Akibatnya, saya memilih yang kedua dan menyalin tutorial doc2vec :). Saya berharap kolega dari tim BigARTM tidak akan gagal untuk mengambil kesempatan dan menunjukkan keunggulan perpustakaan mereka di kompetisi.
Kami sekali lagi memiliki rencana sederhana: kami mengambil semua teks dari tes, melatih model Doc2Vec, kemudian menyimpulkannya di kereta dan mempelajari logreg pada hasilnya (susun adalah segalanya bagi kami!). Tapi, seperti biasa, masalah dimulai segera. Meskipun jumlah teks yang relatif sederhana dalam sampel pelatihan (hanya satu setengah gigabyte), ketika mencoba menyeretnya ke jalan, python memakan 20 (20 Karl!) Memori, beralih ke swap dan tidak kembali. Saya harus makan gajah di beberapa bagian.
Saat membaca, kami selalu menunjukkan kolom mana yang akan diangkat dari lantai, yang memungkinkan kami untuk tidak membaca teks mentah dalam memori. Ini menghemat penggunaannya hingga setengahnya, dokumen dari set uji dimuat ke dalam memori untuk pelatihan tanpa masalah. Dengan satu set pelatihan trik semacam itu tidak cukup, jadi pada suatu waktu kami mengunggah tidak lebih dari satu file "parket". Selanjutnya, dalam file yang diunduh, kami hanya meninggalkan ID hari yang ingin kami gunakan untuk pelatihan, dan kami sudah menyimpulkannya.
Logging di atas ini berfungsi sama cepatnya, dan pada akhirnya kita mendapatkan 14 paragraf dan skor 0,54 :)
Garis dasar gambar

Apa yang bisa lebih populer daripada pembelajaran mendalam? Hanya kucing! Oleh karena itu, untuk gambar dasar, kami membuat rencana sederhana yang brilian: kami menjalankan detektor kucing pada gambar-gambar dari set tes, dan kemudian kami memberi peringkat konten sesuai dengan skor :)
Dan lagi ada banyak untuk dipilih. Klasifikasi atau deteksi? pyTorch atau Tensorflow? Kriteria utama adalah kemudahan implementasi dengan metode copy-paste. Dan pemenangnya adalah ... YOLOv3 di MXNet :). Keringkasan demo mereka memikat pada pandangan pertama, tetapi kemudian, seperti biasa, masalah dimulai.
Apa yang bekerja dengan data besar biasanya dimulai? Dengan perkiraan kinerja dan waktu alat berat yang diperlukan! Saya ingin membuat garis dasar se otonom mungkin, jadi mereka mengajarkannya untuk bekerja secara langsung dengan file tar dan dengan cepat menyadari bahwa dengan kecepatan mengekstraksi 200 foto per detik dari tar ke tmpfs, dibutuhkan waktu sekitar setengah jam, norma untuk memproses 352.758 gambar. Tambahkan pemuatan dan preprocessing foto - 100 per detik, sekitar satu jam untuk semuanya, norma. Tambahkan perhitungan jaringan saraf - 20 foto per detik, 5 jam, yah ... ok. Tambahkan hasil ekstraksi - 1 foto per detik, minggu, WTF?
Setelah beberapa jam menari dengan rebana, pemahaman muncul bahwa NDArray yang kita amati tidak pernah numpy, tetapi struktur internal MXNet, yang melakukan semua perhitungan dengan malas. Bingo! Apa yang harus dilakukan Siapa saja pemula yang tahu bahwa itu semua tentang ukuran bets! Jika MXNet menghitung skor dengan malas, maka jika kami pertama kali meminta mereka untuk beberapa lusin foto, dan kemudian kami mulai mengekstraksinya, maka mungkin pemrosesan foto akan dilakukan dalam batch? Dan ya, setelah menambahkan batching pada kecepatan 10 foto per detik, saya berhasil menemukan semua kucing :).
Kemudian kami menerapkan teknik terkenal dan dalam 10 paragraf kami mendapat skor 0,504 :).
Kesimpulan

Ketika satu sensei yang bijak ditanya, "Siapa yang akan menang, master Aikido atau karate?", Dia menjawab "Tuan akan menang." Kami dituntun ke kesimpulan yang kira-kira sama dengan percobaan ini: tidak ada dan tidak bisa menjadi bahasa yang ideal untuk semua kesempatan. Dengan Python, Anda dapat dengan cepat mengumpulkan solusi dari blok yang sudah jadi, tetapi mencoba untuk menjauh dari mereka dengan jumlah data yang cukup besar akan membawa banyak rasa sakit. Di Java dan Scala, Anda juga dapat menemukan banyak alat yang siap pakai dan dengan mudah mengimplementasikan ide-ide Anda sendiri, tetapi bahasa itu sendiri akan lebih menuntut kualitas kode.
Dan tentu saja, semoga sukses untuk semua anggota SNA Hackathon 2019 !