Avatar
Ba
3 Project tại lớp học MLEs

Project là một trong những điểm nhấn quan trọng trong các lớp học của ProtonX. Với lớp triển khi mô hình trên sản phẩm thực tế - MLEs thì các project sẽ tập trung vào việc triển khai được các mô hình có hiệu năng cao trên server thực tế.

Hai chủ đề trong lớp học này bao gồm:

  • Triển khai mô hình nhận diện văn bản từ hình ảnh

  • Mô hình hỏi đáp trả lời câu hỏi

Mỗi nhóm sẽ chia làm 2 bạn phụ trách việc triển khai (deploy) lên server và lập trình client sao cho có thể đẩy ảnh/văn bản từ client lên server và nhận kết quả inference.

Project 1 - Triton Inference Server tập trung vào Client

Trong bài tập này chúng ta cùng nhau nghiên cứu cách deploy một pipeline có nhiều hơn model lên một hệ thống Trion Inference Server.

Quy trình nhận diện một bức ảnh từ đó trả về văn bản trong bức ảnh đó:

  • Client sẽ gửi bức ảnh lên Triton Server, server sẽ nhận diện các khu vực có văn bản rồi trả về bounding boxs của những văn bản đó

  • Sau khi client nhận được các bouding boxs này, client sẽ cắt ảnh theo các boxs rồi từ đó gửi ảnh đã được cắt này tên Triton Server, server sẽ chạy model nhận diện văn bản trong ảnh này và trả về văn bản cho client

Chúng ta cùng lập trình bài tập này nhé.

A. Tiến hành convert các mô hình nền tảng

  • Mô hình phát hiện văn bản

  • Mô hình nhận diện văn bản

    Dưới đây là code để chuyển các model về định dạng mong muốn

    Khởi tạo một docker

    docker run -it --gpus all -v ${PWD}:/workspace nvcr.io/nvidia/tensorflow:<yy.mm>-tf2-py3

    Sử dụng bạn 23.05

    docker run -it --gpus all -v ${PWD}:/workspace nvcr.io/nvidia/tensorflow:23.05-tf2-py3

    1) Mô hình phát hiện văn bản

    ## Execute from Part_5-Model_Ensembles Directory
    if [ ! -d "./model_repository" ]; then
        echo "Execute from the 'Part_5-Model_Ensembles' directory"
        exit 1
    fi
    
    ## Download Text Detection Model
    mkdir -p downloads
    wget -P downloads https://www.dropbox.com/s/r2ingd0l3zt8hxs/frozen_east_text_detection.tar.gz
    tar -xvf downloads/frozen_east_text_detection.tar.gz -C downloads
    
    ## Convert to ONNX
    pip install -U tf2onnx
    mkdir -p model_repository/text_detection/1
    python -m tf2onnx.convert \
        --input downloads/frozen_east_text_detection.pb \
        --inputs "input_images:0" \
        --outputs "feature_fusion/Conv_7/Sigmoid:0","feature_fusion/concat_3:0" \
        --output model_repository/text_detection/1/model.onnx

Đây là code chuyển mô hình East Text Detector từ Tensorflow thành ONNX. Chi tiết về mô hình xem tại đây.

2) Mô hình nhận diện văn bản

Tiến hành download mô hình này:

## Execute from Part_5-Model_Ensembles Directory
if [ ! -d "./model_repository" ]; then
    echo "Execute from the 'Part_5-Model_Ensembles' directory"
    exit 1
fi

## Download Text Detection Model
mkdir -p downloads
wget -P downloads https://www.dropbox.com/sh/j3xmli4di1zuv3s/AABzCC1KGbIRe2wRwa3diWKwa/None-ResNet-None-CTC.pth

Sau khi đã download weight thành công, bạn hãy chuyển mô hình này thành ONNX.

from pathlib import Path

import torch
from model import STRModel

# Create PyTorch Model Object
model = STRModel(input_channels=1, output_channels=512, num_classes=37)

# Load model weights from external file
state = torch.load("downloads/None-ResNet-None-CTC.pth")
state = {key.replace("module.", ""): value for key, value in state.items()}
model.load_state_dict(state)

# Create ONNX file by tracing model
model_directory = Path("model_repository/text_recognition/1/")
model_directory.mkdir(parents=True, exist_ok=True)
trace_input = torch.randn(1, 1, 32, 100)
torch.onnx.export(
    model,
    trace_input,
    model_directory / "model.onnx",
    verbose=True,
    dynamic_axes={"input.1": [0], "308": [0]},
)

B. Sắp xếp hai mô hình này vào thư mục để serving

Tham khảo cách làm tại video lớp học trên lớp

C. Nhiệm vụ viết Client

Mục tiêu sẽ cần viết được Client theo quy trình sau:

  • Client sẽ gửi bức ảnh lên Triton Server, server sẽ nhận diện các khu vực có văn bản rồi trả về bounding boxs của những văn bản đó

  • Sau khi client nhận được các bouding boxs này, client sẽ cắt ảnh theo các boxs rồi từ đó gửi ảnh đã được cắt này tên Triton Server, server sẽ chạy model nhận diện văn bản trong ảnh này và trả về văn bản cho client

Project 2 - Triton Inference Server tập trung vào Server

Khác với phần cách thiết kế tập trung vào Client

Cách thiết kế tiếp theo sẽ tập trung vào phần Server.

Quy trình nhận diện một bức ảnh từ đó trả về văn bản trong bức ảnh đó:

  • Client sẽ gửi bức ảnh lên Triton Server, server sẽ nhận diện các khu vực có văn bản rồi xuất ra bounding boxs của những văn bản đó

  • Các Bouding boxes này sẽ được xử lý tiếp trên server và thực hiện nhận diện

  • Kết quả cuối cùng được trả về bao gồm văn bản nằm trong ảnh

Để thực hiện được Project này bạn cần nắm được các viết Python Module để giao tiếp giữa các model khác nhau trên Triton Server. Tham khảo cách viết tại đây:

https://github.com/triton-inference-server/tutorials/blob/main/Conceptual_Guide/Part_6-building_complex_pipelines/model_repository/pipeline/1/model.py

Cách này đã được trình bày trong phần Video của buổi học Triton Inference Server. Bạn tham khảo ở đây nhé:

https://protonx.io/courses/6471d348220a44001aa0d734/topics/652380ae1cd2490012a0cee3

Project 3 - Deploy Bert với SQUAD model trên Triton Inference Server

Project này sẽ tập trung đưa mô hình Bert được trên với dữ liệu SQUAD lên trên Triton Server. Bộ dữ liệu SQUAD là bộ dữ liệu cho phép tìm ra câu trả lời của một câu hỏi bất kỳ trong một đoạn văn bản.

Một số nguồn tham khảo

Nhiệm vụ:

  • Sau khi đã train và export được mô hình, phải serving được mô hình này trên Triton Inference Server

  • Viết Client script để thực hiện inference