Bagaimana Docker Dapat Membantu Anda Menjadi Ilmuwan Data Yang Lebih Efektif
Bagaimana Docker Bisa Membantu Anda Menjadi Ilmuwan Data yang Lebih Efisien
Selama 5 tahun terakhir, saya sudah dengar banyak rumor mengenai wadah buruh pelabuhan. Sepertinya semua rekan eksperimen perangkat lunak saya menggunakannya untuk mengembangkan aplikasi. Saya ingin cari tahu bagaimana tehnologi ini bisa membuat saya lebih efisien, tapi saya menemukan tutorial online terlampau mendetail: menjelaskan fitur yang tidak akan pernah saya pakai sebagai ilmuwan data, atau terlalu dangkal: tidak memberi saya info yang cukup untuk menolong saya memahami langkah jadi efisien dengan Docker dengan cepat.
Saya menulis primer cepat ini sehingga Anda tak perlu menguraikan semua informasi di luar sana dan sebagai gantinya dapat mempelajari hal-hal yang perlu Anda ketahui untuk memulai secara cepat
Sunting 24/8/2020: Artikel ini dicatat pada tahun 2017. Sebagian besar masih betul, dan saya sudah memberi anotasi di beberapa tempat di mana banyak hal telah berubah. nikmati catatan mendetail yang saya buat mengenai Docker yang saya catat belakangan ini. Apa itu Docker?
Anda dapat menganggap Docker sebagai mesin virtual ringan — yang berisi semua yang Anda butuhkan untuk menjalankan aplikasi. Kontainer pekerja pelabuhan bisa merekam snapshot status sistem Anda sehingga orang lain dapat membuat ulang lingkungan komputasi Anda dengan cepat. panduan, tapi untuk lebih detail Anda bisa menuju kesini.
Mengapa Anda harus memakai buruh pelabuhan?
- Reproduksibilitas: Sangat penting bahwa pekerjaan Anda dapat direproduksi sebagai ilmuwan data professional. Misalnya, jika Anda membuat model dengan python, seringkali tidak cukup hanya menjalankan pip-freeze dan mengirimkan file requirements.txt yang dihasilkan ke kolega Anda karena itu hanya akan mengenkapsulasi dependensi khusus python — sedangkan seringkali ada dependensi yang ada di luar python seperti sistem operasi, kompiler, driver, file konfigurasi, atau data lain yang dibutuhkan supaya kode Anda bisa berjalan dengan sukses. berbagi dependensi python, membungkus semuanya dalam wadah Docker mengurangi beban orang lain untuk membuat ulang lingkungan Anda dan membuat pekerjaan Anda lebih gampang diakses.
- Portabilitas lingkungan komputasi Anda: Sebagai ilmuwan data, terutama dalam pembelajaran mesin, sanggup mengubah lingkungan komputasi Anda dengan cepat bisa mempengaruhi produktivitas Anda secara drastis. Pekerjaan sains data kerap diawali dengan pembuatan prototipe, penelusuran, dan penelitian — pekerjaan yang tidak memerlukan keahlian khusus sumber daya komputasi langsung dari kelelawar. Tugas ini kerap dilaksanakan di netbook atau computer individu. seperti pembelajaran mendalam. Saya menyaksikan banyak ilmuwan data membatasi diri mereka pada lingkungan komputasi lokal mereka karena anggapan gesekan dalam menciptakan kembali lingkungan lokal mereka di mesin jarak jauh. Docker membuat proses porting lingkungan Anda (semua pustaka, file, dan lain-lain.) jadi sangat gampang. Mem-porting lingkungan komputasi Anda dengan cepat merupakan keunggulan kompetitif yang sangat besar dalam kompetisi Kaggle karena Anda bisa n manfaatkan sumber daya komputasi yang berharga di AWS dengan cara yang hemat biaya Terakhir, membuat file docker memungkinkan Anda mem-porting banyak hal yang Anda sukai tentang lingkungan lokal Anda — seperti alias bash atau plugin vim.
- Perkuat keterampilan teknis Anda: merasa nyaman dengan Docker dapat memungkinkan Anda mengaplikasikan model atau analisis Anda sebagai aplikasi (misalkan sebagai titik akhir REST API yang dapat memberikan prediksi) yang membuat pekerjaan Anda bisa diakses oleh orang lain. mungkin ada di tempat Docker seperti database atau aplikasi lain.
Terminologi Docker
Sebelum kita menyelam lebih dalam, akan sangat membantu untuk mengenal terminologi Docker:
- Gambar: Adalah cetak biru untuk apa yang ingin Anda buat. Contoh: Ubuntu + TensorFlow dengan Driver Nvidia dan Server Jupyter yang sedang berjalan.
- Kontainer: Adalah contoh dari gambar yang telah Anda hidupkan. Anda bisa menjalankan banyak salinan dari gambar yang sama. Sangat penting untuk memahami perbedaan antara gambar dan tempat karena ini adalah sumber umum kebingungan untuk yang baru Jika perbedaan di antara gambar dan tempat tidak jelas, BERHENTI dan baca kembali.
- Dockerfile: Resep untuk membikin Gambar Dockerfile berisi sintaks Docker khusus Dari dokumentasi sah: Dockerfile ialah document text yang berisi semua perintah yang bisa dipanggil pengguna pada baris perintah untuk menyusun gambar.
- Komit: Seperti git, wadah Docker menawarkan kontrol versi. Anda bisa menyimpan status tempat buruh pelabuhan Anda kapan saja sebagai image baru dengan melakukan perubahan.
- Komit: Seperti git, wadah Docker menawarkan kontrol versi. Anda bisa menyimpan status tempat buruh pelabuhan Anda kapan saja sebagai image baru dengan melakukan perubahan.
- DockerHub / Registri Gambar: Tempat orang bisa memposting gambar pekerja pelabuhan publik (atau pribadi) untuk memfasilitasi kolaborasi dan berbagi.
- Susunan: modifikasi ke gambar yang ada, diwakili oleh instruksi di Dockerfile. Susunan diterapkan secara berurutan ke gambar dasar untuk membuat gambar akhir.
Saya akan memakai terminologi ini sepanjang sisa posting jadi lihat kembali daftar ini jika Anda tersesat Sangat mudah untuk bingung antara istilah-istilah ini, terutama antara gambar dan tempat — jadi waspadalah saat Anda membaca!
Instal Docker
Anda dapat mengunduh dan memasang Docker Community Edition secara gratis.
Buat Gambar Docker Pertama Anda
Sebelum Anda membuat docker container, ada gunanya membuat Dockerfile yang akan menentukan gambar. Mari kita telusuri Dockerfile di bawah ini secara perlahan. Anda bisa menemukan file ini di repo Github yang disertakan untuk tutorial ini.
# reference: https://hub.docker.com/_/ubuntu/
FROM ubuntu:16.04
# Adds metadata to the image as a key value pair example LABEL version="1.0"
LABEL maintainer="Hamel Husain <[email protected]>"
##Set environment variables
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
RUN apt-get update --fix-missing && apt-get install -y wget bzip2 ca-certificates \
build-essential \
byobu \
curl \
git-core \
htop \
pkg-config \
python3-dev \
python-pip \
python-setuptools \
python-virtualenv \
unzip \
&& \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN echo 'export PATH=/opt/conda/bin:$PATH' > /etc/profile.d/conda.sh && \
wget --quiet https://repo.continuum.io/archive/Anaconda3-5.0.0.1-Linux-x86_64.sh -O ~/anaconda.sh && \
/bin/bash ~/anaconda.sh -b -p /opt/conda && \
rm ~/anaconda.sh
ENV PATH /opt/conda/bin:$PATH
RUN pip --no-cache-dir install --upgrade \
altair \
sklearn-pandas
# Open Ports for Jupyter
EXPOSE 7745
#Setup File System
RUN mkdir ds
ENV HOME=/ds
ENV SHELL=/bin/bash
VOLUME /ds
WORKDIR /ds
ADD run_jupyter.sh /ds/run_jupyter.sh
RUN chmod +x /ds/run_jupyter.sh
# Run a shell script
CMD ["./run_jupyter.sh"]
Pernyataan DARI
FROM ubuntu:16.04
Pernyataan FROM merangkum bagian paling ajaib dari Docker. Pernyataan ini menentukan gambar dasar yang ingin Anda buat di atasnya. Pernyataan ini tidak dapat menemukannya secara lokal, melainkan akan mencari Docker Registry yang Anda tuju yang default adalah DockerHub. Mekanisme pelapisan ini nyaman bagi Anda sering ingin menginstal program Anda di atas sistem operasi seperti Ubuntu.scratch, Anda cukup membangun di atas image resmi Ubuntu!Ada berbagai macam gambar Docker yang dihosting di Dockerhub, terhitung yang sediakan lebih dari sekedar mekanisme, misalkan bila Anda ingin wadah dengan Anaconda sudah terpasang, Anda dapat membuat wadah di atas gambar docker anaconda resmi.Yang terpenting, Anda juga dapat menerbitkan gambar yang telah Anda buat kapan saja meskipun gambar itu udah dibuat dengan cara melapis ke p dari gambar lain!
Dalam contoh ini, kami menentukan bahwa image dasar kami adalah ubuntu:16.04 yang akan mencari repo DockerHub yang disebut ubuntu. Jika Anda menavigasi ke repo DockerHub Ubuntu, Anda akan melihat jika versi Ubuntu yang berbeda sesuai dengan tag yang berbeda:
Misalnya, pada saat penulisan ini, ubuntu:16.04, ubuntu:xenial-20171201, ubuntu:xenial, dan ubuntu:latest semuanya merujuk ke Ubuntu versi 16.04 dan semuanya adalah alias untuk gambar yang sama.repositori menautkan Anda ke Dockerfiles yang seperti yang digunakan untuk membuat gambar untuk tiap versi. Anda tidak akan selalu menemukan Dockerfiles di repositori DockerHub karena pengelola tidak harus menyertakan Dockerfile tentang cara mereka membuat gambar. untuk melihat beberapa Dockerfiles ini untuk lebih memahami Dockerfiles ( tetapi tunggu sampai Anda selesai dengan tutorial ini !)
Ada satu tag yang penting disebutkan secara eksklusif — tag :latest. Tag ini menentukan apa yang akan Anda ambil secara default jika Anda tidak menentukan tag dalam pernyataan FROM. Misalkan, bila pernyataan FROM Anda terlihat seperti ini:
FROM ubuntu
Selanjutnya Anda hanya akan menarik gambar ubuntu:16.04 Mengapa?- Jika Anda melihat lebih dekat pada tangkapan layar di atas, Anda akan melihat tag :latest dikaitkan dengan 16.04
Satu catatan terakhir tentang gambar Docker: lakukan penilaian yang masuk akal saat menarik gambar Docker acak dari DockerHub Gambar Docker yang dibuat oleh aktor jahat berpotensi berisi perangkat lunak berbahaya.
pernyataan LABEL
Pernyataan ini menambahkan metadata ke gambar Anda, dan sepenuhnya opsional. Saya menambahkan ini agar orang lain tahu siapa yang perlu dihubungi tentang gambar itu dan agar saya bisa mencari tempat pekerja dermaga saya, terutama saat ada banyak tempat yang berjalan secara bersamaan di server.
LABEL maintainer="Hamel Husain <youremail>"
Pernyataan ENV
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
Ini memungkinkan Anda untuk mengganti variabel lingkungan dan cukup mudah.
Pernyataan RUN
Ini biasanya merupakan pekerja keras untuk capai apa yang Anda inginkan dalam membuat citra Docker.Anda dapat menjalankan perintah shell sewenang-wenang seperti apt-get dan pip install untuk menginstal paket dan dependensi yang Anda inginkan.
RUN apt-get update --fix-missing && apt-get install -y wget bzip2
build-essential \
ca-certificates \
git-core \
...
Dalam hal ini, saya menginstal beberapa utilitas yang saya suka seperti curl, htop, byobu dan menginstal anaconda, diikuti oleh pustaka lain yang tidak disertakan dalam instalasi anaconda dasar (gulir ke atas ke Dockerfile lengkap untuk melihat semua pernyataan RUN).
Perintah setelah pernyataan RUN tidak ada hubungannya dengan Docker tapi merupakan perintah linux normal yang akan Anda jalankan jika Anda menginstal paket ini sendiri, jadi jangan khawatir jika Anda tidak terbiasa dengan beberapa paket atau perintah linux ini. saran lebih lanjut - ketika saya pertama kali mulai belajar tentang pekerja dermaga, saya melihat Dockerfiles lain di Github atau DockerHub dan menyalin dan menempelkan sisi relevan yang saya harapkan di Dockerfile saya.
Satu hal yang mungkin Anda perhatikan tentang pernyataan RUN adalah pemformatannya. Setiap pustaka atau paket diindentasi dengan rapi dan diatur dalam urutan abjad agar mudah dibaca. Ini adalah konvensi umum untuk Dockerfiles, jadi saya sarankan Anda adopsi ini karena akan memudahkan kolaborasi.
Pernyataan EXPOSE
Pernyataan ini berguna bila Anda coba mengekspos port — misalnya jika Anda melayani netbook jupyter dari dalam tempat atau seperti layanan web. Dokumentasi Docker cukup bagus dalam menjelaskan pernyataan EXPOSE:
Instruksi EXPOSE tidak benar-benar menerbitkan port. Ini berfungsi sebagai jenis dokumentasi antara orang yang membuat image dan orang yang menjalankan container, tentang port mana yang dimaksudkan untuk dipublikasikan. , gunakan flag -p pada docker run untuk memublikasikan dan memetakan satu atau lebih port, atau flag -P untuk memublikasikan semua port yang terbuka dan memetakannya ke port tingkat tinggi.
Pernyataan VOLUME
VOLUME /ds
Pernyataan ini memungkinkan Anda share data antara container pekerja dermaga dan komputer host. Pernyataan VOLUME memungkinkan Anda memasang volume yang dipasang secara eksternal. Direktori host hanya dideklarasikan saat container dijalankan (karena Anda mungkin menjalankan container ini di computer yang berbeda), bukan saat gambar sedang ditentukan*. Untuk saat ini, Anda hanya menentukan nama folder di dalam tempat pekerja dermaga yang ingin Anda bagikan dengan tempat host.
Dari tutorial pengguna pekerja dermaga:
*Direktori host dideklarasikan saat container run-time: Direktori host (mountpoint), pada dasarnya, bergantung pada host. Hal ini untuk menjaga portabilitas gambar. karena direktori host yang diberikan tidak dapat dijamin tersedia di Karena alasan ini, Anda tidak dapat memasang direktori host dari dalam Dockerfile. Instruksi VOLUME tidak mendukung penetapan parameter host-dir. Anda harus menentukan titik pemasangan saat membuat atau menjalankan penampung.
Selain itu, volume ini dimaksudkan untuk menyimpan data di luar sistem file tempat, yang seringkali bermanfaat jika Anda bekerja dengan data dalam jumlah besar yang Anda tidak ingin membengkak gambar pekerja dermaga. directory VOLUME ini tidak akan disimpan sebagai sisi gambar, namun data yang ada di luar directory ini dalam tempat akan disimpan.
Pernyataan WORKDIR
WORKDIR /ds
Pernyataan ini menetapkan directory kerja jika Anda ingin mereferensikan file tertentu tanpa jalur absolut di perintah lain.
CMD [“./run_jupyter.sh”]
Yang mengasumsikan directory kerja adalah /ds
Pernyataan ADD
EDIT 24/8/2020: Sekarang Anda harus menggunakan Pernyataan SALIN alih-alih pernyataan TAMBAH.
ADD run_jupyter.sh /ds/run_jupyter.sh
Perintah ini memungkinkan Anda untuk menyalin file dari computer host ke tempat pekerja dermaga saat tempat pekerja dermaga dijalankan.
Perhatikan bagaimana jalur tempat host tidak sepenuhnya ditentukan di sini, karena jalur host relatif terhadap directory konteks yang Anda tentukan saat tempat dijalankan (yang akan dibahas nanti).
Kebetulan saya akan memiliki file run_jupyter.sh di root directory konteks ketika saya menjalankan tempat ini, jadi itu penyebabnya tidak ada jalur di depan file sumber.
Dari tutorial pengguna:
ADD <src>... <dest> The ADD instruction copies new files, directories or remote file URLs from <src> and adds them to the filesystem of the image at the path <dest>.
Pernyataan CMD
Container Docker dirancang dengan ide bahwa mereka bersifat sementara dan hanya akan bertahan cukup lama untuk menyelesaikan menjalankan aplikasi yang ingin Anda jalankan. Salah satunya cara yang dilakukan beberapa orang hanya dengan menjalankan bash shell (yang tidak berhenti kecuali Anda mematikan dia).
CMD [“./run_jupyter.sh”]
Pada perintah di atas saya menjalankan skrip shell yang menginstansiasi server netbook Jupyter. Tetapi, jika Anda tidak mempunyai aplikasi spesifik yang ingin Anda jalankan tapi Anda ingin tempat Anda berjalan tanpa keluar — Anda cukup menjalankan bash shell saja dengan perintah berikut :
CMD ["/bin/bash"]
Ini berfungsi karena bash shell tidak berhenti sampai Anda keluar darinya, sehingga tempat tetap aktif dan berjalan.
ri tutorial pengguna:
Hanya boleh ada satu instruksi CMD di Dockerfile. Jika Anda mendaftar lebih dari satu CMD maka hanya CMD terakhir yang akan berlaku. Tujuan utama CMD adalah untuk menyediakan default untuk wadah pelaksana.
Bangun citra Docker Anda
Fiuh, itu banyak informasi tentang Dockerfiles. Jangan cemas, semuanya cukup mudah disini. Saat ini kita sudah membuat resep kita dalam bentuk DockerFile, waktunya untuk membuat gambar. Perintah berikut ini:
Ini akan membuat gambar pekerja dermaga (bukan tempat, baca terminologi di awal posting ini jika Anda tidak ingat apa bedanya !), yang kemudian dapat Anda jalankan di lain waktu.
Buat dan jalankan tempat dari gambar Docker Anda
Saat ini Anda siap untuk menggunakan semua keajaiban ini. Kami bisa memunculkan lingkungan ini dengan menjalankan perintah berikut ini:
Setelah Anda menjalankan ini, penampung Anda akan aktif dan berjalan! Server jupyter akan berjalan karena
CMD [“./run_jupyter.sh”]
perintah diakhir Dockerfile. Saat ini Anda seharusnya bisa mengakses netbook jupyter Anda pada port yang dilayaninya — dalam contoh ini seharusnya bisa diakses dari http://localhost:7745/ dengan tutorial kata sandi. Bila Anda menjalankan tempat pekerja dermaga ini dari jarak jauh, Anda harus mengatur penerusan porta lokal sehingga Anda bisa mengakses server jupyter dari browser Anda.
Berinteraksi Dengan Tempat Anda
Setelah penampung Anda aktif dan berjalan, perintah ini akan berguna:
Lampirkan babak terminal baru ke tempat. Ini berguna bila Anda perlu menginstal beberapa perangkat lunak atau menggunakan shell.
- Simpan status tempat Anda sebagai gambar baru. Meskipun Anda memulai dengan Dockerfile dengan semua pustaka yang ingin Anda instal, lama-lama Anda bisa mengubah status tempat secara signifikan dengan menambahkan lebih banyak pustaka dan paket secara interaktif. Bermanfaat untuk menyimpan status penampung Anda sebagai gambar yang nantinya bisa Anda bagi atau lapisi di atasnya. Anda bisa melakukannya dengan menggunakan perintah docker commit CLI:
docker commit <container_name> new_image_name:tag_name(optional)
atau contoh, jika saya ingin menyimpan status tempat bernama container1 sebagai gambar namanya hamelsmu/tutorial:v2, saya cukup menjalankan perintah ini:
docker commit container_1 hamelsmu/tutorial:v2
Anda mungkin bertanya mengapa hamelsmu/ ada di depan nama gambar — ini memudahkan untuk mendorong tempat ini ke DockerHub nanti, karena hamelsmu ialah nama pengguna DockerHub saya (lebih lanjut mengenai ini nanti). Jika Anda menggunakan Docker di tempat kerja, kemungkinan ada repo Docker pribadi internal tempat Anda bisa mendorong gambar Docker Anda.
- Buat daftar tempat yang sedang berjalan. Saya kerap menggunakan ini ketika saya lupa nama tempat yang sedang berjalan.
docker ps -a -f status=running
Bila Anda menjalankan perintah di atas tanpa flag status=running, maka Anda akan melihat daftar semua container (bahkan jika tidak lagi berjalan) di sistem Anda. Ini bisa berguna untuk melacak tempat lama.
- Cantumkan semua gambar yang telah Anda simpan secara lokal.
docker images
- Dorong gambar Anda ke DockerHub (atau registri lain). Ini berguna jika Anda ingin membagi karya Anda dengan orang lain, atau menyimpan gambar dengan nyaman di cloud. Hati-hatilah agar Anda tidak membagi info pribadi apa pun saat melakukan ini (ada juga repo pribadi yang tersedia di DockerHub).
Pertama buat repositori DockerHub dan berikan nama gambar Anda dengan tepat, seperti yang diterangkan di sini. Ini akan melibatkan menjalankan perintah docker login untuk pertama kali terhubung ke akun Anda di DockerHub atau registri lain. Misalnya, untuk mendorong gambar ke tempat ini, pertama kali saya harus memberi nama gambar lokal saya sebagai hamelsmu/tutorial (saya bisa memilih nama tag apa) Misalnya, perintah CLI:
docker push hamelsmu/tutorial:v2
Dorong gambar pekerja dermaga yang disebutkan di atas ke repositori ini dengan tag v2. Perlu dicatat jika Anda membuat gambar Anda ada untuk umum, orang lain bisa dengan mudah melapisi gambar Anda seperti kami menambahkan susunan ke gambar ubuntu dalam tutorial ini. Ini benar-benar berguna untuk orang yang lain ingin mereproduksi atau memperluas penelitian Anda.
Sekarang Anda Memiliki Kemampuan Super
Sekarang setelah Anda mengetahui cara menjalankan Docker, Anda bisa melakukan beberapa tugas berikut ini:
- Bagikan penelitian yang dapat direproduksi dengan relasi dan rekan.
- Menangkan kompetisi Kaggle tanpa bangkrut, dengan memindahkan code Anda ke lingkungan komputasi yang lebih besar untuk sementara sesuai kebutuhan.
- Prototipe secara lokal dalam tempat pekerja dermaga di netbook Anda, dan dengan mulus memindahkan perhitungan yang serupa ke server tanpa bersusah payah, sambil membawa banyak hal yang Anda sukai tentang lingkungan lokal Anda (alias Anda, plugin vim, skrip bash, disesuaikan prompt, dan lain-lain).
- Instansiasi dengan cepat semua dependensi yang diperlukan untuk menjalankan Tensorflow, Pytorch, atau pustaka pembelajaran mendalam yang lain di computer GPU memakai Nvidia-Docker (yang bisa menyakitkan jika Anda melakukan ini dari sejak awalnya). Lihat bagian bonus di bawah ini untuk informasi selanjutnya.
- Publikasikan model Anda sebagai aplikasi, misalkan sebagai rest api yang menyajikan prediksi dari tempat pekerja pelabuhan. Saat aplikasi Anda di Docker, itu bisa direplikasi dengan mudah sebanyak yang dibutuhkan.
Bacaan lebih lanjut
Kami hanya menggores permukaan Docker, dan masih banyak lagi yang bisa Anda lakukan. Saya berfokus pada sektor Docker yang menurut saya akan paling sering Anda jumpai sebagai Ilmuwan Data dan mudah-mudahan memberikan Anda kepercayaan diri yang cukup untuk mulai menggunakannya.
terima kasih!!!