Ở bài trước, chúng ta đã tìm hiểu và thực hành với Kubernetes Job và thấy được sự phù hợp và hiệu quả của nó đối với các tác vụ trong bài toán AI. Tuy nhiên, có thể dễ dàng nhận thấy một nhược điểm của Job, đó là Job phải được tạo một cách thủ công. Điều này khá là bất tiện, vì chúng ta sẽ phải mất công giám sát hoạt động của hệ thống để can thiệp vào (tạo Job) khi cần. Liệu có cách nào làm cho Job có thể tự động được tạo ra và thực hiện nhiệm vụ của nó tại những thời điểm nhất định, theo chu kỳ? Kubernetes CronJob chính là câu trả lời. Trong bài này, hãy cùng nhau làm việc với CronJob nhé!
1. Kubernetes CronJob là gì?
CronJob là một bộ lập lịch, tương tự như Cron Task
trong nhân Linux. Nó giúp chúng ta tạo ra một kế hoạch thực hiện một công việc nào đó (bằng cách tạo ra các Jobs), tại những thời điểm trong tương lai theo một chu kỳ mà ta định nghĩa.
Đối với bài toán AI, CronJob phù hợp với các tác vụ cần chạy định kỳ, ví dụ như là Batch Inference, Feature Extraction, …
2. Làm việc với CronJob
Chúng ta sẽ sử dụng lại Docker Image ở bài trước.
Mục đích của mình ở đây là tạo ra một CronJob để thực hiện Batch Inference mỗi phút. File model được lưu trên AWS S3.
Hãy xem cấu trúc thư mục làm việc:
kubernetes_cronjob
│ ├── cronjob
│ │ └── cronjob-inference.yaml
│ └── docker
│ ├── batch_inference.py
│ ├── Dockerfile
│ └── train.py
Giống như Pod và Job, CronJob cũng được tạo thông qua file cấu hình (cronjob-inference.yaml):
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: inference-cronjob
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: inference-container
imagePullPolicy: Always
image: tiensu/docker-ml:latest
command: ["python3", "inference.py"]
env:
- name: AWS_ACCESS_KEY_ID
value: ""
- name: AWS_SECRET_ACCESS_KEY
value: ""
restartPolicy: Never
backoffLimit: 0
Các thông tin cấu hình khá giống với của Pod, Job. Chỉ có 1 thông tin mới cần lưu ý ở đây:
Để tạo CronJob, chạy lệnh sau:
$ kubectl create -f cronjob-inference.yaml
cronjob.batch/inference-cronjob created
Xem thông tin của CronJob vừa tạo:
kubectl get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
inference-cronjob * * * * * False 0 <none> 19s
Bởi vì bản chất của CronJob là tạo ra các Jobs, nên ta hãy xem thử các Jobs được tạo ra sau mỗi phút:
$ kubectl get jobs --watch
NAME COMPLETIONS DURATION AGE
inference-cronjob-1611919440 1/1 15s 82s
inference-cronjob-1611919500 1/1 14s 21s
inference-cronjob-1611919560 0/1 0s
inference-cronjob-1611919560 0/1 0s 0s
inference-cronjob-1611919560 1/1 15s 15s
inference-cronjob-1611919380 1/1 16s 3m21s
inference-cronjob-1611919620 0/1 0s
inference-cronjob-1611919620 0/1 0s 0s
Cờ --watch
sẽ cho phép lắng nghe sự kiện có bất kỳ sự thay đổi nào trong việc sử dụng tài nguyên của Job, chẳng hạn như tạo, hủy Job.
Chú ý: Tên của Job = Tên của CronJob + chuỗi số ngẫu nhiên.
Để xem các Pods tạo ra bởi Job sau mỗi phút, cần kết hợp với Job tại thời điểm đó. Ví dụ xem logs của Job inference-cronjob-1611919380
:
kubectl get pods --selector=job-name=inference-cronjob-1611919380
NAME READY STATUS RESTARTS AGE
inference-cronjob-1611919380-cqdtd 0/1 Completed 0 78s
Có Pod rồi, ta có thể xem logs tạo ra bởi Pod đó:
$ kubectl logs inference-cronjob-1611919380-cqdtd
Running inference...
Loading data...
Loading model from: /docker/model/clf.joblib
Scoring observations...
[15.32448686 27.68741572 24.21374322 31.94786177 10.40175849 34.31050209
22.05210667 11.58265489 13.19650094 42.84036647 33.03218733 15.77635169
23.93521876 19.85532224 25.43466604 20.55132127 13.67707622 47.44313586
17.6460682 21.51806638 22.57388848 16.97645106 16.25503893 20.57862843
14.57438158 11.81385445 24.78353556 37.77877263 30.23411048 19.67713185
23.19380271 24.96712102 18.65459129 30.35476911 8.9560549 13.8130382
14.18848318 17.3840622 19.83840166 24.09904134 20.52649052 15.32433651
25.8157052 16.47533793 19.2214524 19.86928427 21.47113681 21.56443118
24.64517965 22.43665872 22.1020877 ]
Như ta thấy, Batch Inference đã được thực hiện thành công thông qua CronJob.
Cuối cùng, xóa CronJob khi không sử dụng nữa:
$ kubectl delete inference-cronjob
cronjob.batch/inference-cronjob deleted
3. Kết luận
Xong, mình đã cũng nhau tìm hiểu và sử dụng CronJob để thực hiện nhiệm vụ Batch Inference trong bài toán AI. Mình đặt lịch chạy Job mỗi phút mục đích là để nhanh chóng nhìn thấy kết quả cho lần demo này. Tùy theo yêu cầu thực tế bài toán, các bạn có thể set giá trị phù hợp cho mình.
Bài viết tiếp theo, chúng ta sẽ tìm hiểu và thực hành với Development. Mời các bạn đón đọc!
Source code của bài này các bạn tham khảo tại đây.
4. Tham khảo