TensorFlow, mengapa python adalah bahasa yang dipilih?

143

Saya baru-baru ini mulai mempelajari pembelajaran mendalam dan teknik ML lainnya, dan saya mulai mencari kerangka kerja yang menyederhanakan proses membangun jaring dan melatihnya, kemudian saya menemukan TensorFlow, memiliki sedikit pengalaman di lapangan, bagi saya, tampaknya kecepatan adalah faktor besar untuk membuat sistem ML besar bahkan lebih jika bekerja dengan pembelajaran yang mendalam, jadi mengapa python dipilih oleh Google untuk membuat TensorFlow? Bukankah lebih baik membuatnya daripada bahasa yang dapat dikompilasi dan tidak ditafsirkan?

Apa keuntungan menggunakan Python dibandingkan bahasa seperti C ++ untuk pembelajaran mesin?

Ollegn
sumber
2
Nitpick kecil: Kompilasi dan interpretasi tidak bertentangan. Selain itu, bahasa pemrograman apa pun dapat diimplementasikan dengan kompiler atau dengan juru bahasa, atau keduanya. Ada jawaban yang bagus tentang perbedaan pada Rekayasa Perangkat Lunak.
8bittree

Jawaban:

240

Hal yang paling penting untuk disadari tentang TensorFlow adalah bahwa, untuk sebagian besar, inti tidak ditulis dengan Python : Itu ditulis dalam kombinasi C ++ dan CUDA yang sangat dioptimalkan (bahasa Nvidia untuk pemrograman GPU). Banyak dari hal itu terjadi, pada gilirannya, dengan menggunakan Eigen (pustaka C ++ dan CUDA berkinerja tinggi) dan cuDNN NVidia (pustaka DNN yang sangat optimal untuk GPU NVidia , untuk fungsi seperti konvolusi ).

Model untuk TensorFlow adalah bahwa programmer menggunakan "beberapa bahasa" (kemungkinan besar Python!) Untuk mengekspresikan model. Model ini, ditulis dalam konstruksi TensorFlow seperti:

h1 = tf.nn.relu(tf.matmul(l1, W1) + b1)
h2 = ...

sebenarnya tidak dieksekusi ketika Python dijalankan. Sebaliknya, apa yang sebenarnya dibuat adalah grafik aliran data yang mengatakan untuk mengambil input tertentu, menerapkan operasi tertentu, menyediakan hasilnya sebagai input untuk operasi lain, dan sebagainya. Model ini dijalankan oleh kode C ++ yang cepat, dan sebagian besar, data yang terjadi di antara operasi tidak pernah disalin kembali ke kode Python .

Kemudian programmer "mendorong" eksekusi model ini dengan menarik node - untuk pelatihan, biasanya dalam Python, dan untuk melayani, kadang-kadang dalam Python dan kadang-kadang dalam C + + mentah:

sess.run(eval_results)

Ini satu Python (atau panggilan fungsi C ++) menggunakan salah satu panggilan dalam proses untuk C ++ atau RPC untuk versi terdistribusi untuk memanggil ke server C ++ TensorFlow untuk memerintahkannya untuk mengeksekusi, dan kemudian menyalin kembali hasilnya.

Jadi, dengan itu, mari kita ulangi pertanyaannya: Mengapa TensorFlow memilih Python sebagai bahasa pertama yang didukung dengan baik untuk mengekspresikan dan mengendalikan pelatihan model?

Jawabannya sederhana: Python mungkin bahasa yang paling nyaman untuk sejumlah besar ilmuwan data dan pakar pembelajaran mesin yang juga mudah diintegrasikan dan memiliki kontrol backend C ++, selain itu juga bersifat umum, banyak digunakan baik di dalam maupun di luar Google, dan open source. Mengingat bahwa dengan model dasar TensorFlow, kinerja Python tidak begitu penting, itu cocok secara alami. Ini juga merupakan nilai tambah besar yang NumPy membuatnya mudah untuk melakukan pra-pemrosesan dengan Python - juga dengan kinerja tinggi - sebelum memasukkannya ke TensorFlow untuk hal-hal yang benar-benar berat CPU.

Ada juga banyak kerumitan dalam mengekspresikan model yang tidak digunakan ketika mengeksekusi - inferensi bentuk (misalnya, jika Anda melakukan matmul (A, B), apa bentuk data yang dihasilkan?) Dan perhitungan gradien otomatis . Ternyata bagus untuk bisa mengekspresikan mereka dengan Python, meskipun saya pikir dalam jangka panjang mereka mungkin akan pindah ke backend C ++ untuk membuat menambahkan bahasa lain lebih mudah.

(Harapannya, tentu saja, adalah untuk mendukung bahasa lain di masa depan untuk membuat dan mengekspresikan model. Ini sudah cukup mudah untuk menjalankan inferensi menggunakan beberapa bahasa lain - C ++ berfungsi sekarang, seseorang dari Facebook memberikan kontribusi Go bindings yang sedang kami tinjau sekarang , dll.)

dga
sumber
1
Bagaimana Anda mendefinisikan 'inferensi' dalam It's already quite straightforward to run inference using several other languagesMenjadi programmer Prolog itu tidak cocok untuk saya; sepertinya sebuah kata keluar dari tempatnya.
Guy Coder
1
Menjalankan hanya lulus maju dari model. Menerapkannya pada data vs pelatihan.
dga
Berkenaan dengan bentuk inferensi. Saya mengonversi beberapa jaringan saraf ke bahasa yang diketik secara statis hanya untuk penggunaan pembelajaran saja dan mengetik Bebek di Ptyhon pasti membuat bagian dari kode lebih mudah untuk ditulis. Di sisi filp, menulis kode Python tanpa tipe membuatnya jauh lebih sulit ketika mempelajari Ptyhon untuk mendapatkan tipe yang tepat sebelum berjalan. Saya melihat banyak kesalahan run time menggunakan Ptyhon daripada bahasa lain yaitu F #. Mungkin perlu dicatat, Bebek mengetikkan jawabannya.
Guy Coder
2
Meskipun itu benar, saya pikir pengetikan python adalah alasan tidak langsung. Dari bahasa-bahasa yang biasa digunakan di Google --- quora.com/... --- Python paling cocok untuk pembelajaran mesin Ph.D. Satu-satunya pilihan nyata lainnya adalah C ++ (saya tidak tahu banyak orang yang menggunakan Lua, menggunakan bahasa Torch), dan C ++ cukup jauh dari zona kenyamanan toolbox ML. Banyak orang ML berasal dari latar belakang matlab, dengan numpy semakin populer. Mengetik bebek mungkin mendasari popularitas, tentu saja, tapi itu di luar jangkauan saya.
Hari
Terima kasih, ringkasan yang bagus. Guy Coder --- dalam arti "inferensi" dalam permainan, lihat artikel Wikipedia tentang inferensi statistik . Ini inferensi induktif yang bertentangan dengan jenis deduktif yang dilakukan oleh Prolog.
Bob Carpenter
35

TF tidak ditulis dengan python. Ini ditulis dalam C ++ (dan menggunakan perpustakaan numerik berkinerja tinggi dan kode CUDA ) dan Anda dapat memeriksa ini dengan melihat github mereka . Jadi intinya ditulis bukan dengan python tetapi TF menyediakan antarmuka untuk banyak bahasa lain ( python, C ++, Java, Go )

masukkan deskripsi gambar di sini

Jika Anda berasal dari dunia analisis data, Anda dapat memikirkannya seperti numpy (tidak ditulis dengan python, tetapi menyediakan antarmuka ke Python) atau jika Anda adalah pengembang web - pikirkan sebagai basis data (PostgreSQL, MySQL, yang dapat dipanggil dari Java, Python, PHP)


Python frontend (bahasa di mana orang menulis model dalam TF) adalah yang paling populer karena banyak alasan . Menurut pendapat saya alasan utamanya adalah historis: mayoritas pengguna ML sudah menggunakannya (pilihan populer lainnya adalah R) jadi jika Anda tidak akan memberikan antarmuka ke python, perpustakaan Anda kemungkinan besar akan ditakdirkan untuk ketidakjelasan.


Tetapi ditulis dengan python tidak berarti bahwa model Anda dieksekusi dengan python. Sebaliknya, jika Anda menulis model Anda dengan cara yang benar Python tidak pernah dieksekusi selama evaluasi grafik TF (kecuali tf.py_func () , yang ada untuk debugging dan harus dihindari dalam model nyata persis karena dijalankan pada Sisi Python).

Ini berbeda dengan misalnya numpy. Misalnya jika Anda melakukannya np.linalg.eig(np.matmul(A, np.transpose(A))(yaitu eig(AA')), operasi akan menghitung transpos dalam beberapa bahasa cepat (C ++ atau fortran), mengembalikannya ke python, mengambilnya dari python bersama-sama dengan A, dan menghitung perkalian dalam beberapa bahasa cepat dan mengembalikannya ke python, lalu hitung nilai eigen dan kembalikan ke python. Jadi meskipun begitu operasi yang mahal seperti matmul dan eig dihitung secara efisien, Anda masih kehilangan waktu dengan memindahkan hasilnya ke python kembali dan memaksa. TF tidak melakukannya , setelah Anda menentukan grafik, tensor Anda mengalir bukan dengan python tetapi dalam C ++ / CUDA / sesuatu yang lain.

Salvador Dali
sumber
Dalam konteks ini posting blog saya mungkin menarik: blog.ephorie.de/why-r-for-data-science-and-not-python
vonjd
4

Python memungkinkan Anda membuat modul ekstensi menggunakan C dan C ++, berinteraksi dengan kode asli, dan masih mendapatkan keuntungan yang diberikan Python kepada Anda.

TensorFlow menggunakan Python, ya, tetapi juga mengandung sejumlah besar C ++ .

Ini memungkinkan antarmuka yang lebih sederhana untuk bereksperimen dengan overhead pemikiran manusia yang lebih sedikit dengan Python, dan menambah kinerja dengan memprogram bagian terpenting dalam C ++.

Alyssa Haroldsen
sumber
0

Rasio terbaru yang dapat Anda periksa dari sini menunjukkan di dalam TensorFlow C ++ membutuhkan ~ 50% kode, dan Python mengambil ~ 40% kode.

Baik C ++ dan Python adalah bahasa resmi di Google sehingga tidak heran mengapa demikian. Jika saya harus memberikan regresi cepat di mana C ++ dan Python hadir ...

C ++ ada di dalam aljabar komputasi, dan Python digunakan untuk semua hal lain termasuk untuk pengujian. Mengetahui bagaimana pengujian ini ada di mana-mana saat ini, tidak heran mengapa kode Python berkontribusi banyak pada TF.

prosti
sumber