Khóa học
Mặc dù AWS EC2 đang dẫn đầu trong lĩnh vực điện toán đám mây, Google Cloud đã phát triển một nền tảng Điện toán Đám mây hấp dẫn và cạnh tranh.
Trong hướng dẫn này, bạn sẽ học cách:
- Tạo một instance trên Google Compute Engine (GCE),
- Cài đặt môi trường khoa học dữ liệu dựa trên bản phân phối Anaconda Python, và
- Chạy Jupyter notebook có thể truy cập trực tuyến.
Làm việc trên đám mây thay vì trên máy của bạn có hai lợi thế chính cho các dự án khoa học dữ liệu:
- Khả năng mở rộng: bạn có thể điều chỉnh sức mạnh (RAM, CPU, GPU) của instance theo nhu cầu tức thời. Bắt đầu với một instance nhỏ và rẻ, rồi bổ sung bộ nhớ, lưu trữ, CPU hoặc GPU khi dự án phát triển.
- Khả năng tái lập: một điều kiện then chốt của mọi dự án khoa học dữ liệu. Cho phép các nhà khoa học dữ liệu khác xem xét mô hình của bạn và tái tạo nghiên cứu là điều kiện cần để triển khai thành công. Bằng cách thiết lập một môi trường làm việc trên instance ảo, bạn đảm bảo rằng công việc của mình có thể dễ dàng được chia sẻ, tái tạo và kiểm chứng bởi các thành viên khác trong nhóm.
Google Compute Engine
Mặc dù được xây dựng dựa trên các khái niệm và thành phần giống nhau (instance, image và snapshot), EC2 và GCE khác nhau về cách truy cập và cách tổ chức tài nguyên.
Một khía cạnh quan trọng của Google Cloud Platform (GCP) là cấu trúc tập trung theo dự án. Tất cả thanh toán, quyền hạn, tài nguyên và cài đặt đều được nhóm trong một dự án do người dùng định nghĩa, cơ bản đóng vai trò như một không gian tên toàn cục. Điều này không chỉ đơn giản hóa việc ánh xạ liên thông giữa các tài nguyên bạn dùng (lưu trữ, cơ sở dữ liệu, instance, ...) mà còn cả quản lý truy cập từ quyền dựa trên vai trò đến khóa ssh và bảo mật. Về mức độ thân thiện và quản lý truy cập, vai trò, tôi nhận thấy làm việc trên GCP dễ hơn AWS, đặc biệt khi dùng nhiều dịch vụ.
GCP cũng cung cấp một số dịch vụ đặc biệt phù hợp cho khoa học dữ liệu, bao gồm nhưng không giới hạn ở:
- Dataprep để xây dựng pipeline xử lý dữ liệu,
- Datalab cho khám phá dữ liệu,
- Google Machine Learning Engine xây dựng trên TensorFlow
- BigQuery giải pháp kho dữ liệu lưu trữ nhiều bộ dữ liệu Big Data thú vị.
Đường cong học tập thấp và các dịch vụ thân thiện với dữ liệu khiến GCP trở thành công cụ không thể thiếu trong bộ đồ nghề của nhà khoa học dữ liệu.
Trước khi bắt đầu khởi chạy instance và cài đặt các gói Python, hãy dành vài phút để xem lại một số thuật ngữ phổ biến dùng trong Điện toán Đám mây.
VM, Đĩa, Image và Snapshot
Một Máy Ảo (VM), còn gọi là "instance", là máy chủ theo nhu cầu mà bạn kích hoạt khi cần. Phần cứng nền tảng được chia sẻ giữa những người dùng khác một cách trong suốt và vì vậy trở nên hoàn toàn ảo đối với bạn. Bạn chỉ chọn vị trí địa lý tổng quát của instance được lưu trữ tại một trong các trung tâm dữ liệu của Google.
Một VM được xác định bởi loại đĩa persistent và hệ điều hành (OS), như Windows hoặc Linux, mà nó được xây dựng trên đó. Đĩa persistent là phần phần cứng ảo dành riêng cho bạn.
Image là sự kết hợp vật lý của một đĩa persistent và hệ điều hành. VM Image thường được dùng để chia sẻ và triển khai một cấu hình cụ thể lên nhiều VM khác. Image công khai là những image do Google cung cấp với lựa chọn OS cụ thể, trong khi image riêng là do người dùng tùy biến.
Snapshot là bản phản ánh nội dung của một VM (đĩa, phần mềm, thư viện, tệp) tại một thời điểm nhất định và chủ yếu dùng cho sao lưu tức thì. Khác biệt chính giữa snapshot và image là snapshot được lưu dưới dạng các phần chênh (diff) so với snapshot trước đó, còn image thì không.
Cả image và snapshot đều có thể dùng để định nghĩa và kích hoạt một VM mới.
Tóm lại, khi bạn khởi chạy một instance mới, GCE bắt đầu bằng cách gắn một đĩa persistent vào VM. Điều này cung cấp dung lượng đĩa và đưa cho instance hệ thống tệp gốc cần thiết để khởi động. Đĩa sẽ cài đặt OS gắn với image bạn đã chọn. Bằng cách chụp snapshot của một image, bạn tạo sao lưu tức thì và có thể sao chép dữ liệu từ các VM hiện có để khởi chạy VM mới.
Hãy đưa tất cả vào thực tế và bắt đầu với VM đầu tiên của bạn!
Bắt đầu với VM đầu tiên trên GCP
Tạo Tài khoản và Dự án
Để mở tài khoản trên GCP, bạn cần tài khoản Google (Gmail) tiêu chuẩn. Tại thời điểm viết bài, Google cung cấp dùng thử miễn phí 12 tháng / 300 đô la cho nền tảng. Mặc dù ưu đãi này đi kèm một số hạn chế (ví dụ không đào coin), nó vẫn đủ để bạn bắt đầu làm việc trong môi trường này.
Để tạo tài khoản GCP với bản dùng thử miễn phí, truy cập cloud.google.com và nhấp nút try it free. Bạn sẽ được yêu cầu đăng nhập bằng tài khoản Google và thêm thông tin thanh toán. Sau khi tạo tài khoản, bạn có thể truy cập bảng điều khiển web tại http://console.cloud.google.com/.
Trước tiên bạn sẽ dùng bảng điều khiển web để định nghĩa và khởi chạy một instance dựa trên Debian, sau đó chuyển sang terminal shell trên web để cài đặt tất cả các gói cần thiết cho bộ công cụ khoa học dữ liệu.
Nhưng trước hết bạn cần tạo một dự án mới:
- Đi tới trang Quản lý Tài nguyên,
- Nhấp vào "Create a new project",
- Chỉ định tiêu đề dự án của bạn và lưu ý cách Google tạo ID dự án tức thời.
- Chỉnh sửa ID dự án nếu cần và nhấp "Create".
ID dự án phải là duy nhất trong không gian tên của GCP, còn tiêu đề dự án có thể là bất kỳ gì bạn muốn. Tôi đặt tên dự án là datacamp-gcp như dưới đây:

Theo mặc định, khi bạn tạo dự án mới, tài khoản Google của bạn được đặt làm chủ sở hữu dự án với toàn quyền và truy cập trên tất cả tài nguyên và thanh toán của dự án.
Trong phần vai trò của trang IAM, bạn có thể thêm người với vai trò cụ thể vào dự án. Trong khuôn khổ hướng dẫn này, bạn sẽ bỏ qua phần đó và giữ bạn là người dùng và quản trị viên duy nhất của dự án.
Tạo một Instance
Để tạo VM đầu tiên, bạn chỉ cần thực hiện các bước sau:
- Vào bảng điều khiển tại https://console.cloud.google.com/home/dashboard và chọn dự án bạn vừa tạo.
- Ở menu góc trên bên trái chọn "Compute Engine" và nhấp "VM instances".
- Trong hộp thoại, nhấp nút "Create".

Bây giờ bạn đang ở trang "Create an Instance".
-
Đặt tên instance: bạn có thể chọn bất kỳ tên nào. Tôi đặt instance là
starling. -
Chọn vùng: nguyên tắc là chọn vùng rẻ nhất gần bạn để giảm độ trễ. Tôi chọn
east-d. Lưu ý giá thay đổi đáng kể theo vùng. -
Chọn bộ nhớ, lưu trữ và CPU bạn cần. Bạn có thể dùng một số cấu hình dựng sẵn hoặc tự tùy chỉnh. Ở đây, tôi chọn cấu hình mặc định
n1-standard-1với 3,75 Gb RAM và 1 vCPU với giá ước tính 24,67 đô/tháng. -
Chọn đĩa khởi động và dùng mặc định Debian GNU/Linux 9 (stretch) OS với 10 Gb. Nếu bạn thích dùng Ubuntu hoặc bản phân phối Linux khác, nhấp "Change" và chọn phù hợp. Vì Ubuntu là biến thể gần của Debian, cả hai bản phân phối đều phù hợp cho hướng dẫn này.

5.Đảm bảo bạn có thể truy cập VM từ internet bằng cách cho phép lưu lượng http và https.

6.(Tùy chọn) Bật đĩa persistent cho mục đích sao lưu: Nhấp vào liên kết "Management, Disks, networking, SSH keys". Điều này hiển thị một tập thẻ, chọn thẻ "Disks" và bỏ chọn "Deletion Rule". Bằng cách này, khi bạn xóa instance, đĩa sẽ không bị xóa và có thể dùng sau để khởi chạy instance mới.

7.Cuối cùng, nhấp "Create". Instance của bạn sẽ sẵn sàng sau vài phút.
Lưu ý liên kết "Equivalent command line" bên dưới nút Create. Liên kết này hiển thị lệnh tương đương để tạo cùng instance từ đầu. Đây là tính năng rất thông minh hỗ trợ học cú pháp của gcloud SDK.
Tại thời điểm này, bạn có một instance đang chạy nhưng khá trống. Có 2 cách bạn có thể truy cập instance. Hoặc cài đặt gcloud SDK trên máy cục bộ, hoặc dùng Cloud Shell của Google.
Cloud Shell của Google
Cloud Shell của Google là một terminal độc lập trong trình duyệt, từ đó bạn có thể truy cập và quản lý tài nguyên. Bạn kích hoạt shell của Google bằng cách nhấp biểu tượng >\_ ở góc trên bên phải trang bảng điều khiển. Phần dưới của trình duyệt biến thành terminal shell.

Terminal này chạy trên một máy ảo Google Compute Engine f1-micro với hệ điều hành Debian và 5 Gb lưu trữ. Nó được tạo theo từng người dùng, từng phiên. Nó tồn tại khi phiên cloud shell của bạn hoạt động và bị xóa sau 20 phút không hoạt động. Vì đĩa đi kèm là persistent giữa các phiên, nội dung của bạn (tệp, cấu hình, ...) sẽ sẵn có từ phiên này sang phiên khác. Instance cloud shell được cài sẵn gcloud SDK và vim.

Điều quan trọng là phân biệt giữa instance Cloud Shell, mang tính người dùng, và instance bạn vừa tạo. Instance nền của cloud shell chỉ là cách thuận tiện để có môi trường quản lý tài nguyên và lưu cấu hình của bạn trên một instance ngắn hạn. VM instance bạn vừa tạo, đặt tên starling trong ví dụ trên, mới là nơi bạn muốn cài đặt môi trường khoa học dữ liệu.
Thay vì dùng Cloud Shell của Google, bạn cũng có thể cài đặt gcloud SDK trên máy cục bộ và quản lý mọi thứ từ môi trường cục bộ.
Dưới đây là một số lệnh hữu ích để quản lý instance.
-
Liệt kê instance của bạn
gcloud compute instances list -
Dừng instance (mất vài giây)
gcloud compute instances stop <instance name> -
Khởi động instance (cũng mất vài giây)
gcloud compute instances start <instance name> -
và ssh vào instance starling
gcloud compute ssh <instance name>
Thiết lập VM
Chạy lệnh cuối cùng đó trong cửa sổ Google Shell để đăng nhập vào instance của bạn. Các bước tiếp theo gồm:
- Cài đặt một vài gói Debian bằng
apt-get install. - Cài đặt bản phân phối Anaconda hoặc Miniconda.
- Thiết lập instance để cho phép truy cập trực tuyến an toàn vào Jupyter notebook.
Gói Debian
Hãy bắt đầu bằng việc cài đặt các gói Debian:
- bzip2, cần thiết để cài Mini/Anaconda,
- git, luôn hữu ích, và
- libxml2-dev, chưa cần ngay nhưng bạn sẽ thường cần khi cài thêm thư viện Python.
Chạy các lệnh sau trong terminal, áp dụng cho cả Ubuntu và Debian:
$ sudo apt-get update
$ sudo apt-get install bzip2 git libxml2-dev
Anaconda / Miniconda
Khi các gói trên đã được cài, hãy chuyển sang cài đặt bản phân phối Anaconda cho Python 3. Bạn có thể chọn cài bản Anaconda đầy đủ bao gồm nhiều thư viện Python khoa học, trong đó có thể có những thứ bạn không cần, hoặc cài bản Miniconda gọn nhẹ, yêu cầu bạn tự cài thư viện Jupyter. Quy trình trong cả hai trường hợp là tương tự.
Để cài bản Miniconda gọn nhẹ, chạy
$ wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
$ bash Miniconda3-latest-Linux-x86_64.sh
$ rm Miniconda3-latest-Linux-x86_64.sh
$ source .bashrc
$ conda install scikit-learn pandas jupyter ipython
Tập lệnh cài đặt được tải xuống và chạy với 2 dòng đầu. Bạn nên chấp nhận giấy phép và vị trí mặc định. Ở dòng 3, tệp shell không còn cần nữa được xóa. Chạy .bashrc ở dòng 4 sẽ thêm lệnh conda vào $PATH của bạn mà không cần mở terminal mới. Cuối cùng, dòng cuối cài các thư viện python cần thiết: scikit-learn pandas jupyter ipython.
Các lệnh để cài bản Anaconda đầy đủ rất giống nhau. Hãy kiểm tra trang tải xuống để lấy phiên bản mới nhất của tệp shell:
$ wget https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh
$ bash Anaconda3-5.0.1-Linux-x86_64.sh
$ rm Anaconda3-5.0.1-Linux-x86_64.sh
$ source .bahsrc
Để xác minh mọi thứ được cài đặt đúng, hãy kiểm tra phiên bản python với python --version và xác minh python mặc định đang được gọi đúng bằng lệnh which python. Bạn sẽ thấy đại loại như

Giờ bạn đã có môi trường Python hoạt động với các thư viện khoa học dữ liệu tiêu chuẩn (sklearn, pandas).
Cho phép Truy cập Web
Bước thứ ba và cuối là cấu hình VM để cho phép truy cập web vào Jupyter notebook của bạn.
Trước tiên bạn cần làm cho VM có thể truy cập từ web. Để làm vậy, bạn sẽ tạo một quy tắc tường lửa qua bảng điều khiển Google Cloud. Quay lại bảng điều khiển Instances và ở menu góc trên bên trái, chọn "VPC Network > Firewall rules". Nhấp vào liên kết "CREATE FIREWAL RULE" và điền các giá trị sau:
- Name: jupyter-rule (bạn có thể chọn bất kỳ tên nào)
- Source IP ranges: 0.0.0.0/0
- Specified protocols and ports: tcp:8888
- và để tất cả biến khác ở giá trị mặc định.
Biểu mẫu sẽ trông như sau:

Quy tắc tường lửa này cho phép mọi lưu lượng đến (từ mọi IP) truy cập cổng 8888.
Dùng liên kết "Equivalent command line", bạn có thể thấy quy tắc tường lửa cũng có thể được tạo từ terminal với lệnh sau:
$ gcloud compute --project=datacamp-gcp firewall-rules create jupyter-rule --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp:8888 --source-ranges=0.0.0.0/0
Bây giờ quay lại trang VM (menu góc trên bên trái > Compute Engine > VM instances), nhấp vào tên VM của bạn.
Ghi lại địa chỉ IP của VM. Đây là địa chỉ IP bạn sẽ dùng trong trình duyệt để truy cập môi trường Jupyter. Trong ví dụ của tôi, địa chỉ IP là: 35.196.81.49, của bạn sẽ khác.

và đảm bảo các quy tắc Tường lửa được tích chọn:

Cấu hình Jupyter
Jupyter notebook đi kèm một tệp cấu hình cần được tạo và chỉnh sửa để thiết lập truy cập trực tuyến cho notebook của bạn. Trong terminal, chạy jupyter notebook --generate-config để tạo tệp cấu hình. Và jupyter notebook password để tạo mật khẩu.
Mẹo: hãy đảm bảo đây là mật khẩu mạnh!
Bây giờ chỉnh sửa tệp cấu hình bạn vừa tạo với vim .jupyter/jupyter_notebook_config.py và thêm dòng sau ở đầu tệp
c.NotebookApp.ip = '*'
(để chuyển sang chế độ chỉnh sửa trong vim, chỉ cần gõ phím i). Thoát và lưu với chuỗi phím ESC:wq.
Điều này sẽ cho phép notebook khả dụng cho mọi địa chỉ IP trên VM của bạn, chứ không chỉ URL http://localhost:8888 mà bạn có thể quen dùng khi làm việc trên máy cục bộ.
Khởi chạy
Bạn đã sẵn sàng khởi chạy Jupyter notebook với lệnh:
$ jupyter-notebook --no-browser --port=8888
Và bạn sẽ thấy tương tự như thế này trong terminal:

Trong trình duyệt, truy cập URL: http://<your_VM_IP>:8888/ để vào Jupyter notebook vừa hoạt động.
Để kiểm tra mọi thứ hoạt động như mong đợi, tạo một notebook Python 3 mới, và import pandas

Intermezzo
Một vài lưu ý về thiết lập hiện tại của bạn:
-
Địa chỉ IP bạn dùng trong trình duyệt là tạm thời. Nghĩa là mỗi lần khởi động lại VM, notebook của bạn sẽ có URL khác. Bạn có thể đặt IP đó thành tĩnh bằng cách vào: Menu góc trên bên trái > VPC Network > External IP addresses và chọn "static" trong menu thả xuống

-
Bảo mật của thiết lập hiện tại dựa vào độ mạnh của mật khẩu Jupyter notebook bạn đã đặt. Bất kỳ ai trên internet cũng có thể truy cập môi trường Jupyter của bạn tại cùng URL bạn dùng (và bot chắc chắn sẽ thử). Một tính năng cốt lõi rất mạnh nhưng cực kỳ không an toàn của Jupyter notebook là bạn có thể mở terminal với quyền sudo trực tiếp từ notebook. Điều này có nghĩa là bất kỳ ai truy cập notebook của bạn sau khi bẻ được mật khẩu đều có thể kiểm soát VM và có khả năng chạy bất cứ thứ gì khiến hóa đơn của bạn tăng vọt. Các biện pháp cấp đầu để ngăn điều đó bao gồm
-
Đảm bảo mật khẩu Jupyter của bạn đủ mạnh
- Nhớ dừng VM khi bạn không làm việc trên đó
Hiện bạn cũng đang chạy máy chủ qua http chứ không phải https, điều này chưa đủ an toàn. Let’s Encrypt cung cấp chứng chỉ SSL/TLS miễn phí và là giải pháp mã hóa được khuyến nghị trong tài liệu jupyter. Để biết thêm về các vấn đề bảo mật khi chạy Jupyter notebook công khai, hãy đọc bài viết này.
IPython
Jupyter notebook rất tiện lợi cho làm việc cộng tác trực tuyến. Nhưng bạn cũng có thể chạy một phiên IPython từ terminal chỉ với lệnh ipython. Lệnh đó sẽ mở một phiên IPython với đầy đủ tiện ích như một Jupyter notebook như lệnh ma thuật (%paste, %run, ...) nhưng không có giao diện web.
R
Thật dễ để thiết lập VM của bạn để bật notebook R trong bảng điều khiển Jupyter. Hướng dẫn bật R Markdown có sẵn trong hướng dẫn tuyệt vời của DataCamp: Jupyter And R Markdown: Notebooks With R của Karlijn Willems.
Kết luận
Google Cloud cung cấp nhiều dịch vụ thú vị cho khoa học dữ liệu và các VM mạnh mẽ nhưng dễ thiết lập, cùng ưu đãi dùng thử miễn phí rất hấp dẫn. Bảng điều khiển web dễ điều hướng và thường hiển thị lệnh tương đương với trang cấu hình hiện tại, nhờ đó giảm rào cản khi dùng gcloud SDK.
Trong bài viết này, bạn đã học cách chọn và khởi chạy một VM instance, cài các gói Debian cần thiết, bản phân phối Anaconda và bộ công cụ khoa học dữ liệu, và cuối cùng là thiết lập quy tắc truy cập để khởi chạy Jupyter notebook có thể truy cập từ trình duyệt.
Mặc dù toàn bộ quy trình có thể hơi phức tạp lần đầu, nhưng bạn sẽ nhanh chóng quen khi tạo và khởi chạy ngày càng nhiều VM. Và nếu mọi thứ trở nên quá rối, bạn luôn có thể xóa VM đang làm việc và bắt đầu lại từ đầu. Đó là một trong những lợi ích của làm việc trên đám mây. Sau vài lần, bạn sẽ có thể khởi tạo hoàn chỉnh môi trường khoa học dữ liệu trên Google Cloud chỉ trong vài phút. Hãy thoải mái liên hệ và chia sẻ nhận xét, câu hỏi với tôi trên twitter: @alexip.