M l ops Kubernetes Docker

Tìm hiểu về Kubernetes và áp dụng vào bài toán AI - Phần 3: Kubernetes CronJob

Tìm hiểu về Kubernetes và áp dụng vào bài toán AI - Phần 3: Kubernetes CronJob

Ở 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:

  • schedule: Đây là giá trị chỉ ra chu kỳ chạy của Job, tuân theo các quy tắc định trước. Tham khảo các quy tắc tại đây. Ngoài ra, nếu bạn cảm thấy bối rối khi sử dụng những quy tắc để tạo schedule, bạn có thể sử dụng công cụ này để giúp đỡ bạn. Ở đây, mình đang cấu hình Schedule là 1 phút, tức cứ mỗi phút, CronJob sẽ tạo ra 1 Job để thực hiện lệnh ``python3 inference.py`.

Để 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