MLOps - Sách dạy nấu ăn, chương 1

MLOps - Sách dạy nấu ăn, chương 1

Chào mọi người! Tôi là nhà phát triển CV tại CROC. Chúng tôi đã triển khai các dự án trong lĩnh vực CV được 3 năm. Trong thời gian này, chúng tôi đã làm rất nhiều việc, chẳng hạn như giám sát tài xế để khi lái xe họ không uống rượu, không hút thuốc, không nói chuyện điện thoại, nhìn đường, không mơ mộng hay ngắm mây. ; Chúng tôi đã ghi lại những người lái xe trên làn đường dành riêng và chiếm nhiều chỗ đậu xe; đảm bảo rằng người lao động đội mũ bảo hiểm, đeo găng tay, v.v.; xác định một nhân viên muốn vào cơ sở; Chúng tôi đã đếm mọi thứ có thể.

Tôi đang làm tất cả những điều này để làm gì?

Trong quá trình triển khai các dự án, chúng ta gặp phải những va chạm, rất nhiều va chạm, một số vấn đề mà các bạn đã quen hoặc sẽ làm quen trong tương lai.

Mô hình hóa tình huống

Hãy tưởng tượng rằng chúng ta có một công việc tại một công ty trẻ “N”, có hoạt động liên quan đến ML. Chúng tôi làm việc trong một dự án ML (DL, CV), sau đó vì lý do nào đó, chúng tôi chuyển sang công việc khác, nói chung là nghỉ ngơi và quay trở lại tế bào thần kinh của chính chúng tôi hoặc của người khác.

  1. Thời điểm của sự thật đến, bằng cách nào đó bạn cần phải nhớ lại nơi bạn đã dừng lại, những siêu thông số bạn đã thử và quan trọng nhất là chúng dẫn đến kết quả gì. Có thể có nhiều tùy chọn cho người lưu trữ thông tin trong tất cả các lần khởi chạy: trong phần đầu, cấu hình, sổ ghi chú, trong môi trường làm việc trên đám mây. Tôi tình cờ thấy một tùy chọn khi siêu tham số được lưu trữ dưới dạng các dòng nhận xét trong mã, nói chung là một sự ưa thích. Bây giờ hãy tưởng tượng rằng bạn không quay lại dự án của mình mà quay lại dự án của một người đã rời công ty và bạn kế thừa một mã và một mô hình có tên model_1.pb. Để hoàn thiện bức tranh và truyền tải hết nỗi đau, hãy tưởng tượng rằng bạn cũng là một chuyên gia mới bắt đầu.
  2. Hãy tiếp tục. Để chạy mã, chúng tôi và mọi người sẽ làm việc với mã đó cần tạo một môi trường. Chuyện thường xảy ra là vì lý do nào đó mà họ không để anh ấy làm tài sản thừa kế của chúng tôi. Đây cũng có thể trở thành một nhiệm vụ không hề nhỏ. Bạn không muốn lãng phí thời gian ở bước này phải không?
  3. Chúng tôi đào tạo một mô hình (ví dụ: máy dò ô tô). Chúng tôi đã đạt đến điểm trở nên rất tốt - đã đến lúc lưu kết quả. Hãy gọi nó là car_Detection_v1.pb. Sau đó, chúng tôi đào tạo một cái khác - car_Detection_v2.pb. Một thời gian sau, các đồng nghiệp của chúng tôi hoặc chính chúng tôi ngày càng giảng dạy nhiều hơn bằng cách sử dụng các kiến ​​trúc khác nhau. Kết quả là, một loạt hiện vật được hình thành, thông tin về chúng phải được thu thập cẩn thận (nhưng chúng ta sẽ làm việc này sau, vì hiện tại chúng ta có nhiều vấn đề ưu tiên hơn).
  4. Được rồi, mọi chuyện đã kết thúc rồi! Chúng tôi có một mô hình! Chúng ta có thể bắt đầu đào tạo mô hình tiếp theo, phát triển kiến ​​trúc để giải quyết vấn đề mới hay chúng ta có thể đi uống trà không? Và ai sẽ triển khai?

Xác định vấn đề

Làm việc trên một dự án hoặc sản phẩm là công việc của nhiều người. Và theo thời gian, mọi người rời đi và đến, có nhiều dự án hơn và bản thân các dự án cũng trở nên phức tạp hơn. Bằng cách này hay cách khác, các tình huống từ chu trình được mô tả ở trên (và không chỉ) trong các kết hợp nhất định sẽ xảy ra từ lần lặp này đến lần lặp khác. Tất cả điều này dẫn đến lãng phí thời gian, nhầm lẫn, căng thẳng, có thể khiến khách hàng không hài lòng và cuối cùng là mất tiền. Mặc dù tất cả chúng ta thường đi theo cùng một cái cào cũ, nhưng tôi tin rằng không ai muốn sống lại những khoảnh khắc này nhiều lần.

MLOps - Sách dạy nấu ăn, chương 1

Vì vậy, chúng tôi đã trải qua một chu kỳ phát triển và chúng tôi thấy rằng có những vấn đề cần được giải quyết. Để làm điều này bạn cần:

  • thuận tiện lưu trữ kết quả công việc;
  • làm cho quá trình thu hút nhân viên mới trở nên đơn giản;
  • đơn giản hóa quá trình triển khai môi trường phát triển;
  • cấu hình quá trình tạo phiên bản mô hình;
  • có một cách thuận tiện để xác nhận các mô hình;
  • tìm một công cụ quản lý nhà nước kiểu mẫu;
  • tìm cách đưa mô hình vào sản xuất.

Rõ ràng cần phải đưa ra một quy trình làm việc cho phép bạn quản lý vòng đời này một cách dễ dàng và thuận tiện? Cách thực hành này được gọi là MLOps

MLOps hay DevOps dành cho máy học, cho phép các nhóm khoa học dữ liệu và CNTT cộng tác cũng như tăng tốc độ phát triển và triển khai mô hình thông qua giám sát, xác thực và quản trị các mô hình học máy.

Bạn có thể danh dựCác nhân viên Google nghĩ gì về tất cả những điều này? Từ bài báo có thể thấy rõ rằng MLOps là một thứ khá đồ sộ.

MLOps - Sách dạy nấu ăn, chương 1

Hơn nữa trong bài viết của tôi, tôi sẽ chỉ mô tả một phần của quá trình. Để triển khai, tôi sẽ sử dụng công cụ MLflow, vì... Đây là một dự án nguồn mở, cần một lượng nhỏ mã để kết nối và có tích hợp với các framework ml phổ biến. Bạn có thể tìm kiếm trên Internet các công cụ khác, chẳng hạn như Kubeflow, SageMaker, Trains, v.v. và có thể tìm thấy một công cụ phù hợp hơn với nhu cầu của bạn.

“Xây dựng” MLOps bằng ví dụ sử dụng công cụ MLFlow

MLFlow là một nền tảng nguồn mở để quản lý vòng đời của các mô hình ml (https://mlflow.org/).

MLflow bao gồm bốn thành phần:

  • Theo dõi MLflow - bao gồm các vấn đề ghi lại kết quả và thông số dẫn đến kết quả này;
  • Dự án MLflow - cho phép bạn đóng gói mã và sao chép nó trên mọi nền tảng;
  • MLflow Models - chịu trách nhiệm triển khai các mô hình vào sản xuất;
  • Sổ đăng ký MLflow - cho phép bạn lưu trữ các mô hình và quản lý trạng thái của chúng trong kho lưu trữ tập trung.

MLflow hoạt động trên hai thực thể:

  • khởi chạy là một chu trình đào tạo đầy đủ, các thông số và số liệu mà chúng tôi muốn đăng ký;
  • Thử nghiệm là một “chủ đề” chạy cùng nhau.

Tất cả các bước của ví dụ đều được triển khai trên hệ điều hành Ubuntu 18.04.

1. Triển khai máy chủ

Để chúng tôi dễ dàng quản lý dự án của mình và nhận được tất cả thông tin cần thiết, chúng tôi sẽ triển khai một máy chủ. Máy chủ theo dõi MLflow có hai thành phần chính:

  • cửa hàng phụ trợ - chịu trách nhiệm lưu trữ thông tin về các mô hình đã đăng ký (hỗ trợ 4 DBMS: mysql, mssql, sqlite và postgresql);
  • kho tạo tác - chịu trách nhiệm lưu trữ các tạo phẩm (hỗ trợ 7 tùy chọn lưu trữ: Amazon S3, Azure Blob Storage, Google Cloud Storage, máy chủ FTP, Máy chủ SFTP, NFS, HDFS).

Khi cửa hàng hiện vật Để đơn giản, hãy lấy một máy chủ sftp.

  • tạo một nhóm
    $ sudo groupadd sftpg
  • thêm người dùng và đặt mật khẩu cho anh ta
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • điều chỉnh một số cài đặt truy cập
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • thêm một vài dòng vào /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • khởi động lại dịch vụ
    $ sudo systemctl restart sshd

Khi cửa hàng phụ trợ Hãy lấy postgresql.

$ sudo apt update
$ sudo apt-get install -y postgresql postgresql-contrib postgresql-server-dev-all
$ sudo apt install gcc
$ pip install psycopg2
$ sudo -u postgres -i
# Create new user: mlflow_user
[postgres@user_name~]$ createuser --interactive -P
Enter name of role to add: mlflow_user
Enter password for new role: mlflow
Enter it again: mlflow
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
# Create database mlflow_bd owned by mlflow_user
$ createdb -O mlflow_user mlflow_db

Để khởi động máy chủ, bạn cần cài đặt các gói python sau (tôi khuyên bạn nên tạo một môi trường ảo riêng):

pip install mlflow
pip install pysftp

Hãy khởi động máy chủ của chúng tôi

$ mlflow server  
                 --backend-store-uri postgresql://mlflow_user:mlflow@localhost/mlflow_db 
                 --default-artifact-root sftp://mlflowsftp:mlflow@sftp_host/upload  
                --host server_host 
                --port server_port

2. Thêm theo dõi

Để kết quả đào tạo của chúng tôi không bị mất, các thế hệ nhà phát triển tương lai có thể hiểu được chuyện gì đang xảy ra, đồng thời để các đồng chí lớn tuổi và các bạn có thể bình tĩnh phân tích quá trình học tập, chúng tôi cần thêm tính năng theo dõi. Theo dõi có nghĩa là lưu các tham số, số liệu, tạo phẩm và bất kỳ thông tin bổ sung nào về việc bắt đầu đào tạo, trong trường hợp của chúng tôi, trên máy chủ.

Ví dụ: tôi đã tạo một nhỏ dự án trên github trên Keras để phân đoạn mọi thứ có trong Tập dữ liệu COCO. Để thêm theo dõi, tôi đã tạo một tệp mlflow_training.py.

Dưới đây là những dòng nơi những điều thú vị nhất xảy ra:

def run(self, epochs, lr, experiment_name):
        # getting the id of the experiment, creating an experiment in its absence
        remote_experiment_id = self.remote_server.get_experiment_id(name=experiment_name)
        # creating a "run" and getting its id
        remote_run_id = self.remote_server.get_run_id(remote_experiment_id)

        # indicate that we want to save the results on a remote server
        mlflow.set_tracking_uri(self.tracking_uri)
        mlflow.set_experiment(experiment_name)

        with mlflow.start_run(run_id=remote_run_id, nested=False):
            mlflow.keras.autolog()
            self.train_pipeline.train(lr=lr, epochs=epochs)

        try:
            self.log_tags_and_params(remote_run_id)
        except mlflow.exceptions.RestException as e:
            print(e)

Ở đây self.remote_server là một trình bao bọc nhỏ bao gồm các phương thức mlflow.tracking. MlflowClient (tôi làm nó để thuận tiện), với sự trợ giúp của nó, tôi tạo một thử nghiệm và chạy nó trên máy chủ. Tiếp theo, tôi chỉ ra nơi kết quả khởi chạy sẽ được hợp nhất (mlflow.set_tracking_uri(self.tracking_uri)). Tôi kích hoạt tính năng ghi nhật ký tự động mlflow.keras.autolog(). Hiện tại MLflow Tracking hỗ trợ ghi nhật ký tự động cho TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Nếu bạn chưa tìm thấy khung hoặc thư viện của mình thì bạn luôn có thể đăng nhập một cách rõ ràng. Chúng tôi đang bắt đầu đào tạo. Đăng ký thẻ và thông số đầu vào trên máy chủ từ xa.

Một vài dòng và bạn, giống như những người khác, có quyền truy cập vào thông tin về tất cả các lần ra mắt. Mát mẻ?

3. Chúng tôi lập dự án

Bây giờ hãy làm cho việc khởi động dự án trở nên dễ dàng. Để thực hiện việc này, hãy thêm tệp MLproject và conda.yaml vào thư mục gốc của dự án.
dự án ML

name: flow_segmentation
conda_env: conda.yaml

entry_points:
  main:
    parameters:
        categories: {help: 'list of categories from coco dataset'}
        epochs: {type: int, help: 'number of epochs in training'}

        lr: {type: float, default: 0.001, help: 'learning rate'}
        batch_size: {type: int, default: 8}
        model_name: {type: str, default: 'Unet', help: 'Unet, PSPNet, Linknet, FPN'}
        backbone_name: {type: str, default: 'resnet18', help: 'exampe resnet18, resnet50, mobilenetv2 ...'}

        tracking_uri: {type: str, help: 'the server address'}
        experiment_name: {type: str, default: 'My_experiment', help: 'remote and local experiment name'}
    command: "python mlflow_training.py 
            --epochs={epochs}
            --categories={categories}
            --lr={lr}
            --tracking_uri={tracking_uri}
            --model_name={model_name}
            --backbone_name={backbone_name}
            --batch_size={batch_size}
            --experiment_name={experiment_name}"

Dự án MLflow có một số thuộc tính:

  • Tên - tên dự án của bạn;
  • Môi trường - trong trường hợp của tôi, conda_env chỉ ra rằng Anaconda được sử dụng để chạy và mô tả phụ thuộc nằm trong tệp conda.yaml;
  • Điểm đầu vào - cho biết chúng tôi có thể chạy tệp nào và với tham số nào (tất cả các tham số được ghi lại tự động khi bắt đầu đào tạo)

conda.yaml

name: flow_segmentation
channels:
  - defaults
  - anaconda
dependencies:
  - python==3.7
  - pip:
    - mlflow==1.8.0
    - pysftp==0.2.9
    - Cython==0.29.19
    - numpy==1.18.4
    - pycocotools==2.0.0
    - requests==2.23.0
    - matplotlib==3.2.1
    - segmentation-models==1.0.1
    - Keras==2.3.1
    - imgaug==0.4.0
    - tqdm==4.46.0
    - tensorflow-gpu==1.14.0

Bạn có thể sử dụng docker làm môi trường thời gian chạy của mình, để biết thêm chi tiết, vui lòng tham khảo tài liệu.

4. Hãy bắt đầu tập luyện

Chúng tôi sao chép dự án và đi đến thư mục dự án:

git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/

Để chạy bạn cần cài đặt thư viện

pip install mlflow
pip install pysftp

Bởi vì trong ví dụ tôi sử dụng conda_env, Anaconda phải được cài đặt trên máy tính của bạn (nhưng bạn có thể giải quyết vấn đề này bằng cách tự cài đặt tất cả các gói cần thiết và thử nghiệm với các tham số khởi chạy).

Tất cả các bước chuẩn bị đã hoàn tất và chúng ta có thể bắt đầu triển khai khóa đào tạo. Từ gốc dự án:

$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .

Sau khi nhập lệnh, môi trường conda sẽ tự động được tạo và quá trình đào tạo sẽ bắt đầu.
Trong ví dụ trên, tôi đã chuyển số kỷ nguyên để đào tạo, các danh mục mà chúng tôi muốn phân đoạn (bạn có thể xem danh sách đầy đủ đây) và địa chỉ máy chủ từ xa của chúng tôi.
Bạn có thể tìm thấy danh sách đầy đủ các tham số có thể có trong tệp MLproject.

5. Đánh giá kết quả học tập

Sau khi hoàn thành khóa đào tạo, chúng tôi có thể truy cập trình duyệt tới địa chỉ máy chủ của chúng tôi http://server_host:server_port

MLOps - Sách dạy nấu ăn, chương 1

Ở đây chúng ta thấy danh sách tất cả các thử nghiệm (trên cùng bên trái), cũng như thông tin về các lần chạy (ở giữa). Chúng tôi có thể xem thông tin chi tiết hơn (thông số, số liệu, thành phần lạ và một số thông tin bổ sung) cho mỗi lần khởi chạy.

MLOps - Sách dạy nấu ăn, chương 1

Đối với mỗi số liệu, chúng ta có thể quan sát lịch sử thay đổi

MLOps - Sách dạy nấu ăn, chương 1

Những thứ kia. Hiện tại, chúng tôi có thể phân tích kết quả ở chế độ “thủ công” và bạn cũng có thể thiết lập xác thực tự động bằng API MLflow.

6. Đăng ký mẫu

Sau khi chúng tôi phân tích mô hình của mình và quyết định rằng nó đã sẵn sàng cho trận chiến, chúng tôi tiến hành đăng ký nó, để làm điều này, chúng tôi chọn lần khởi chạy mà chúng tôi cần (như thể hiện trong đoạn trước) và đi xuống.

MLOps - Sách dạy nấu ăn, chương 1

Sau khi chúng ta đặt tên cho mô hình của mình, nó sẽ có một phiên bản. Nếu bạn lưu một model khác có cùng tên, phiên bản sẽ tự động được nâng cấp.

MLOps - Sách dạy nấu ăn, chương 1

Đối với mỗi mô hình, chúng tôi có thể thêm mô tả và chọn một trong ba trạng thái (Giai đoạn, Sản xuất, Đã lưu trữ); sau đó, bằng cách sử dụng API, chúng tôi có thể truy cập vào các trạng thái này, cùng với việc lập phiên bản, mang lại sự linh hoạt bổ sung.

MLOps - Sách dạy nấu ăn, chương 1

Chúng tôi cũng có thể dễ dàng truy cập vào tất cả các mô hình

MLOps - Sách dạy nấu ăn, chương 1

và phiên bản của họ

MLOps - Sách dạy nấu ăn, chương 1

Như trong đoạn trước, tất cả các thao tác có thể được thực hiện bằng API.

7. Triển khai mô hình

Ở giai đoạn này, chúng tôi đã có một mô hình (keras) được đào tạo. Một ví dụ về cách bạn có thể sử dụng nó:

class SegmentationModel:
    def __init__(self, tracking_uri, model_name):

        self.registry = RemoteRegistry(tracking_uri=tracking_uri)
        self.model_name = model_name
        self.model = self.build_model(model_name)

    def get_latest_model(self, model_name):
        registered_models = self.registry.get_registered_model(model_name)
        last_model = self.registry.get_last_model(registered_models)
        local_path = self.registry.download_artifact(last_model.run_id, 'model', './')
        return local_path

    def build_model(self, model_name):
        local_path = self.get_latest_model(model_name)

        return mlflow.keras.load_model(local_path)

    def predict(self, image):
        image = self.preprocess(image)
        result = self.model.predict(image)
        return self.postprocess(result)

    def preprocess(self, image):
        image = cv2.resize(image, (256, 256))
        image = image / 255.
        image = np.expand_dims(image, 0)
        return image

    def postprocess(self, result):
        return result

Ở đây self.registry lại là một trình bao bọc nhỏ trên mlflow.tracking.MlflowClient để thuận tiện. Vấn đề là tôi truy cập vào một máy chủ từ xa và tìm kiếm một mẫu máy có tên được chỉ định và phiên bản sản xuất mới nhất ở đó. Tiếp theo, tôi tải tạo phẩm cục bộ xuống thư mục ./model và xây dựng mô hình từ thư mục này mlflow.keras.load_model(local_path). Bây giờ chúng ta có thể sử dụng mô hình của mình. Các nhà phát triển CV (ML) có thể dễ dàng cải tiến mô hình và xuất bản các phiên bản mới.

Kết luận

Tôi đã trình bày một hệ thống cho phép:

  • lưu trữ tập trung thông tin về mô hình ML, tiến độ và kết quả đào tạo;
  • nhanh chóng triển khai môi trường phát triển;
  • theo dõi và phân tích tiến độ làm việc trên các mô hình;
  • thuận tiện cho việc phiên bản và quản lý trạng thái của các mô hình;
  • Thật dễ dàng để triển khai các mô hình kết quả.

Ví dụ này là một món đồ chơi và đóng vai trò là điểm khởi đầu để xây dựng hệ thống của riêng bạn, có thể bao gồm tự động hóa việc đánh giá kết quả và đăng ký mô hình (điểm 5 và 6, tương ứng) hoặc bạn sẽ thêm phiên bản của bộ dữ liệu hoặc có thể là thứ gì khác ? Điểm tôi đang cố gắng đưa ra là bạn cần MLOps nói chung, MLflow chỉ là phương tiện để đạt được mục đích.

Viết những vấn đề bạn gặp phải mà tôi không hiển thị?
Bạn sẽ thêm gì vào hệ thống để đáp ứng nhu cầu của bạn?
Bạn sử dụng những công cụ và phương pháp nào để giải quyết tất cả hoặc một phần vấn đề?

PS Tôi sẽ để lại một vài liên kết:
dự án github - https://github.com/simbakot/mlflow_example
Dòng chảy ML - https://mlflow.org/
Email công việc của tôi cho các câu hỏi - [email được bảo vệ]

Công ty chúng tôi định kỳ tổ chức nhiều sự kiện khác nhau dành cho các chuyên gia CNTT, ví dụ: vào ngày 8 tháng 19 lúc 00:XNUMX giờ Matxcơva sẽ có buổi gặp mặt CV dưới hình thức trực tuyến, nếu quan tâm, bạn có thể tham gia, đăng ký đây .

Nguồn: www.habr.com

Thêm một lời nhận xét