Ultralytics YOLO27:

Xuất model Ultralytics YOLO cho Ambarella CVflow#

Việc triển khai model Ultralytics YOLO trên SoC Ambarella yêu cầu biên dịch model bằng các công cụ biên dịch của Ambarella; các model được tối ưu cho kiến trúc CVflow sẽ có hiệu năng suy luận tốt hơn. Bản fork này của Ultralytics tích hợp trực tiếp bộ công cụ nén SpongeTorch của Ambarella vào pipeline huấn luyện, xác thực và xuất model, giúp nhà phát triển tạo ra các model được tối ưu để triển khai hiệu quả trên phần cứng Ambarella.

Hướng dẫn này trình bày quy trình triển khai phát hiện đối tượng hiện tại, từ huấn luyện có tính đến nén đến suy luận trên thiết bị (xem Tổng quan quy trình để biết pipeline đầy đủ).

Định dạng checkpoint AmbaPB là phần mở rộng dành riêng cho Ambarella của đặc tả ONNX IR, hỗ trợ các primitive tính toán CVflow và đóng gói các artifact do công cụ SDK tạo ra. Đây là artifact phía host dùng để xác thực độ chính xác của model đã biên dịch trước khi triển khai; Cavalry binary riêng biệt được tạo cho thiết bị đích mới là thứ chạy trên bo mạch.

Lưu ý

Quy trình này phụ thuộc vào các thành phần SDK độc quyền của Ambarella không có trên PyPI. Để nhận các gói SDK cần thiết, hãy đăng ký tại Ambarella Developer Zone và yêu cầu quyền truy cập thông qua Cooper™ Developer Platform.

Hỗ trợ

Tích hợp này do Ambarella duy trì. Hãy báo cáo các vấn đề về fork, SpongeTorch hoặc SDK cho bộ phận hỗ trợ Ambarella.

Ambarella là công ty nào?#

Ambarella, có trụ sở chính tại Santa Clara, California, là công ty bán dẫn chuyên thiết kế các SoC AI biên. Bộ xử lý của công ty kết hợp xử lý tín hiệu hình ảnh, mã hóa video và tính toán AI trên chip, được sử dụng trong các thiết bị an ninh, ô tô, robot, công nghiệp và tiêu dùng.

CVflow là gì?#

CVflow là kiến trúc xử lý thị giác của Ambarella. Kiến trúc này sử dụng một engine thị giác chuyên dụng, tách biệt với CPU và GPU, để chạy các tác vụ thị giác máy tính và mạng nơ-ron. Các model được huấn luyện bằng những framework như PyTorch sẽ được biên dịch sang định dạng gốc của CVflow bằng SDK Ambarella trước khi chạy trên engine.

Các dòng SoC CVflow hiện tại và ứng dụng điển hình:

Dòng SoCỨng dụng điển hình
CV72 / CV75Camera an ninh AI 4K, camera thông minh, thị giác công nghiệp
CV5 / CV52Drone, camera hành động, robot, hệ thống đa camera
N1-655Thiết bị phân tích video đa luồng và AI tạo sinh triển khai tại chỗ

Tại sao nên triển khai YOLO trên Ambarella?#

  • Hiệu năng trên mỗi watt: Các SoC CVflow được thiết kế cho AI biên hoạt động liên tục, chạy phát hiện đối tượng theo thời gian thực trong giới hạn công suất của camera.
  • Huấn luyện có tính đến nén: SpongeTorch thực hiện pruning trong quá trình huấn luyện để giúp model duy trì độ chính xác, đồng thời trở nên thưa hơn và hiệu quả hơn khi triển khai trên CVflow.
  • Pipeline camera tích hợp: Các SoC Ambarella kết hợp bộ xử lý tín hiệu hình ảnh (ISP), mã hóa video ultra-HD và CVflow để hỗ trợ nhiều hệ thống camera với mức tiêu thụ điện năng thấp, nhờ đó một SoC Ambarella duy nhất có thể xử lý toàn bộ pipeline camera AI.

Tổng quan quy trình#

Pipeline gồm sáu giai đoạn:

  1. Huấn luyện có tính đến nén — huấn luyện bằng cấu hình SpongeKit (amba_config) để SpongeTorch áp dụng pruning không cấu trúc tăng dần trong quá trình huấn luyện. Khi độ chính xác của lượng tử hóa sau huấn luyện (PTQ) không đạt yêu cầu, SpongeTorch cũng hỗ trợ huấn luyện có nhận biết lượng tử hóa (QAT), nhưng hiện quy trình này chưa được tích hợp vào bản Ultralytics này và dự kiến sẽ có trong bản phát hành tương lai.
  2. Xuất ONNX — xuất checkpoint đã nén bằng cùng amba_config, giữ nguyên cấu trúc nén trong graph ONNX.
  3. Biên dịch — biên dịch model ONNX thành checkpoint AmbaPB bằng công cụ biên dịch SDK; các công cụ này áp dụng PTQ cho engine CVflow.
  4. Xác thực trên host — chạy model *.ambapb.ckpt.onnx đã biên dịch qua Ultralytics predict/val bằng backend AmbaPB để xác minh độ chính xác trước khi triển khai.
  5. Chuyển đổi sang Cavalry — chuyển checkpoint AmbaPB đã xác thực thành Cavalry binary bằng các công cụ SDK.
  6. Chạy trên thiết bị — chạy Cavalry binary trên thiết bị bằng thư viện runtime SDK của Ambarella.

Quy trình huấn luyện và xuất model bằng SpongeTorch là tùy chọn và có thể thay bằng cách xuất ONNX thông thường (xem Xuất model không dùng SpongeTorch).

Điều kiện tiên quyết#

Cài đặt#

Cài đặt bản fork Ultralytics này, sau đó thiết lập SDK Ambarella CVflow — bao gồm công cụ biên dịch và thư viện cvflowbackend — rồi cài đặt wheel spongetorch được phân phối kèm theo:

Cài đặt
# Install this Ultralytics fork from source
git clone https://github.com/Ambarella-Inc/ultralytics
cd ultralytics
git checkout amba_v8.4.46
pip install -e .

# Access and set up the Ambarella SDK compilation tools
# After the environment is ready, install the spongetorch library
pip install /path/to/spongetorch-*.whl

AutoBackend tìm cvflowbackend thông qua lệnh tv2 (tv2 -libpath cvflowbackend) của công cụ biên dịch SDK; vì vậy, công cụ biên dịch SDK phải được cài đặt và có trong PATH trước khi chạy suy luận hoặc xác thực bằng model đã biên dịch.

Tệp cấu hình SpongeKit#

SpongeTorch được điều khiển bằng tệp cấu hình SpongeKit (định dạng protobuf-text, .prototxt), trong đó xác định các lượt pruning, bao gồm mục tiêu độ thưa và lịch nén. Lấy cấu hình mẫu và tài liệu schema tương ứng từ bản phát hành SDK Ambarella của bạn. Để đảm bảo tính nhất quán giữa huấn luyện, xác thực và triển khai, hãy dùng cấu hình huấn luyện khi cần chuẩn bị lại model cho bước xác thực, đồng thời luôn dùng cùng cấu hình khi xuất checkpoint đã nén.

Các tham số Amba#

Hai tham số điều khiển tích hợp SpongeTorch ở các chế độ train, val và export:

Tham sốLoạiMặc địnhMô tả
amba_configstrNoneĐường dẫn đến cấu hình SpongeKit được truyền cho spongetorch.prepare(). Bật huấn luyện có tính đến nén và xuất model có nhận biết SpongeTorch.
amba_chipsetstrNoneTên chipset đích được truyền cho spongetorch.set_target_chipset(), ví dụ: CV72.

Bản fork cũng bổ sung một tham số xuất model dùng chung:

Tham sốLoạiMặc địnhMô tả
export_filestrNoneĐường dẫn/tên đầu ra tùy chỉnh khi xuất model, ví dụ: '/tmp/model.onnx' hoặc 'model.onnx'.

Huấn luyện có tính đến nén#

Huấn luyện (hoặc fine-tune) model với tính năng nén SpongeTorch được bật:

Cách sử dụng
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.train(
    data="coco8.yaml",
    epochs=100,
    amba_config="config.prototxt",
    amba_chipset="CV72",
)

Khi đặt amba_config, trainer sẽ bọc model và optimizer bằng spongetorch.prepare() trong quá trình thiết lập. Nén được áp dụng tăng dần theo lịch từng bước, giúp mạng học cách duy trì độ chính xác đồng thời trở nên thưa hơn. Checkpoint đã huấn luyện lưu trạng thái thưa của SpongeTorch (các tensor _orig/_mask), cần thiết cho bước xuất model sau đó. Tệp cấu hình được sao chép vào thư mục lần chạy dưới dạng amba_config.prototxt để đảm bảo khả năng tái lập.

Điều kiện lưu checkpoint

best.pt và last.pt được cố ý không lưu cho đến khi lịch nén SpongeTorch vượt qua end_step — checkpoint mới nén một phần sẽ không sử dụng được. Đảm bảo epochs đủ dài để lịch trong cấu hình của bạn hoàn tất; log sẽ cho biết thời điểm bắt đầu lưu checkpoint. Nếu quá trình huấn luyện kết thúc trước khi lịch hoàn tất, epoch cuối vẫn được lưu kèm cảnh báo, nhưng không nên triển khai checkpoint đó.

Fine-tune thay vì huấn luyện từ đầu

Để đạt độ chính xác tốt nhất, trước tiên hãy huấn luyện model theo cách thông thường (hoặc bắt đầu từ checkpoint pretrained), sau đó chạy một lượt fine-tune nén ngắn hơn với amba_config trên trọng số đã huấn luyện.

Xác thực checkpoint đã nén#

Xác thực độ chính xác trước khi biên dịch bằng cùng cấu hình:

Cách sử dụng
yolo val model=runs/detect/train/weights/best.pt data=coco8.yaml \
  amba_config=config.prototxt amba_chipset=CV72

Validator áp dụng lại spongetorch.prepare() khi cần và tắt hợp nhất Conv+BN để bảo toàn cấu trúc nén. So sánh mAP với baseline chưa nén; nếu mức giảm độ chính xác quá lớn, hãy điều chỉnh cấu hình SpongeKit rồi huấn luyện lại.

Xuất sang ONNX#

Xuất checkpoint đã nén bằng cùng amba_config được dùng khi huấn luyện:

Cách sử dụng
from ultralytics import YOLO

model = YOLO("runs/detect/train/weights/best.pt")
model.export(
    format="onnx",
    amba_config="config.prototxt",
    amba_chipset="CV72",
)

Exporter dựng lại model, áp dụng lại spongetorch.prepare() bằng cấu hình của bạn, nạp lại trọng số checkpoint thưa vào cấu trúc đã chuẩn bị và trace sang ONNX khi đã tắt hợp nhất Conv+BN — tạo ra graph đúng định dạng mà công cụ biên dịch SDK yêu cầu.

Bảo toàn metadata của model#

Khi xuất ONNX, tác vụ của model, tên lớp, stride và kích thước đầu vào được nhúng vào tệp ONNX; trong khi đó, backend AmbaPB đọc thông tin này từ tệp sidecar metadata.yaml nằm cạnh model đã biên dịch. Nếu công cụ biên dịch SDK không tạo tệp sidecar này, hãy trích xuất tệp từ model ONNX trước khi biên dịch:

import onnx

from ultralytics.utils import YAML

model = onnx.load("model.onnx")
YAML.save("metadata.yaml", {item.key: item.value for item in model.metadata_props})

Giữ metadata.yaml trong cùng thư mục với tệp *.ambapb.ckpt.onnx hoặc *.ambapb.fastckpt.onnx đã biên dịch.

Cảnh báo
  • Checkpoint phải bao gồm trạng thái nén SpongeTorch. Nếu đặt amba_config khi xuất checkpoint chưa nén, hệ thống sẽ báo lỗi: "Checkpoint has no SpongeTorch pruning state... Use a compressed checkpoint from amba training before export."
  • Cấu hình phải khớp với cấu hình đã dùng trong quá trình huấn luyện. Dùng cấu hình khác có thể khiến trọng số checkpoint không được nạp chính xác.

Biên dịch bằng công cụ SDK#

Biên dịch model ONNX đã xuất cho chipset đích bằng công cụ biên dịch SDK, theo hướng dẫn biên dịch của SDK. Các công cụ này ánh xạ graph lên engine AI CVflow — áp dụng PTQ, lập lịch và lập kế hoạch bộ nhớ — rồi tạo checkpoint AmbaPB để xác thực trên host.

PTQ áp dụng lượng tử hóa INT8 bằng hình ảnh hiệu chuẩn (được chuẩn bị theo hướng dẫn biên dịch của SDK); công cụ biên dịch cân bằng độ chính xác với độ trễ runtime: ánh xạ nhiều phép toán hơn sang INT8 giúp giảm độ trễ nhưng có thể làm giảm độ chính xác, trong khi giữ nhiều phép toán hơn ở FP16 giúp duy trì độ chính xác với độ trễ cao hơn. Khi PTQ không thể đạt mục tiêu độ chính xác ở mức INT8 cần thiết cho ngân sách độ trễ, QAT với SpongeTorch là giải pháp phù hợp — phương pháp này huấn luyện model chịu được lượng tử hóa INT8 mạnh hơn, khôi phục độ chính xác tại điểm vận hành có độ trễ thấp hơn. QAT hiện chưa có trong tích hợp này và dự kiến sẽ được bổ sung trong bản phát hành tương lai.

Lưu ý

Để Ultralytics nhận diện model đã biên dịch, tên tệp phải kết thúc bằng .ambapb.ckpt.onnx hoặc .ambapb.fastckpt.onnx.

Chạy suy luận bằng model đã biên dịch#

Model AmbaPB đã biên dịch được tải trực tiếp qua API Ultralytics — AutoBackend phát hiện hậu tố .ambapb và chuyển hướng suy luận qua cvflowbackend, thực thi model như khi chạy trên engine AI:

Cách sử dụng
from ultralytics import YOLO

model = YOLO("model.ambapb.ckpt.onnx")

# Inference
results = model("https://ultralytics.com/images/bus.jpg")

# Validation
metrics = model.val(data="coco8.yaml")

Đây là bước kiểm tra độ chính xác cuối cùng trước khi triển khai lên phần cứng, bao gồm mọi ảnh hưởng từ lượng tử hóa của compiler. Nếu có tệp metadata.yaml nằm cạnh model đã biên dịch, backend sẽ đọc tên lớp, stride và thông tin tác vụ từ tệp đó. Theo mặc định, backend sử dụng chế độ suy luận CVflow acinf; đặt biến môi trường ULTRALYTICS_AMBAPB_DEBUG=1 để ghi log chi tiết đầu vào/đầu ra phục vụ gỡ lỗi.

Chuyển đổi sang Cavalry binary#

Sau khi checkpoint AmbaPB vượt qua bước xác thực trên host, hãy dùng công cụ biên dịch SDK để chuyển đổi checkpoint thành Cavalry binary cho thiết bị đích theo hướng dẫn biên dịch của SDK. Cavalry binary là định dạng được thư viện runtime SDK thực thi trên bo mạch.

Triển khai trên bo mạch#

Nạp Cavalry binary lên thiết bị Ambarella bằng runtime SDK Ambarella. Tiền xử lý và hậu xử lý phải khớp với cấu hình mà model phát hiện được biên dịch cho: đầu vào RGB letterbox trong dải 0–255 và giải mã đầu ra phát hiện YOLO tiêu chuẩn. Tham khảo tài liệu triển khai của SDK để biết các API runtime.

Xuất model không dùng SpongeTorch#

Nếu không cần pruning trong quá trình huấn luyện của SpongeTorch, pipeline Ultralytics tiêu chuẩn cũng có thể tạo model để công cụ SDK biên dịch:

Cách sử dụng
yolo export model=yolo26n.pt format=onnx

Biên dịch ONNX thu được bằng công cụ biên dịch SDK; các công cụ này tự thực hiện lượng tử hóa sau huấn luyện. Cách này đánh đổi một phần hiệu năng runtime và độ chính xác sau lượng tử hóa để có quy trình đơn giản hơn, không phụ thuộc vào spongetorch trong quá trình huấn luyện.

Ứng dụng thực tế#

Model Ultralytics YOLO trên SoC Ambarella CVflow hỗ trợ thị giác biên luôn hoạt động:

  • Camera an ninh AI: phát hiện người và phương tiện theo thời gian thực trên camera IP 4K trong giới hạn công suất dưới 3 W.
  • Drone và robot: phát hiện và theo dõi đối tượng trên thiết bị để phục vụ điều hướng, kiểm tra và giao hàng trên chip cấp CV5.
  • Phân tích công nghiệp và bán lẻ: đếm người đa luồng, phát hiện PPE và giám sát kệ hàng trên các thiết bị biên.

Tóm tắt#

Hướng dẫn này trình bày quy trình hiện tại để triển khai model Ultralytics YOLO trên SoC Ambarella CVflow: huấn luyện có tính đến nén bằng SpongeTorch (amba_config/amba_chipset), xuất checkpoint đã nén sang ONNX, biên dịch ngoại tuyến thành checkpoint AmbaPB bằng công cụ SDK, xác thực trên host qua Ultralytics và chuyển đổi thành Cavalry binary để triển khai trên thiết bị bằng SDK Ambarella.

Đối với các mục tiêu AI biên khác, hãy xem hướng dẫn liên quan về Hailo, Rockchip RKNN, Sony IMX500, Qualcomm QNN, DEEPX và Axelera. Để xem danh sách đầy đủ các định dạng xuất model, hãy truy cập tài liệu chế độ Export và trang tích hợp.

Câu hỏi thường gặp#

  • Không. Không có đích format="ambarella". Hãy xuất sang ONNX (có thể nén bằng SpongeTorch thông qua amba_config), sau đó biên dịch model ONNX ngoại tuyến thành AmbaPB bằng công cụ biên dịch SDK Ambarella.

  • Có thể nhắm đến mọi SoC dựa trên CVflow được công cụ biên dịch SDK của bạn hỗ trợ, bao gồm các dòng CV72/CV75 cho camera AI và CV5/CV52 cho drone và robot. Tham số amba_chipset cấu hình mục tiêu tối ưu hóa của SpongeTorch; hãy chọn riêng mục tiêu tương ứng khi biên dịch. Các chuỗi chipset được chấp nhận và khả năng hỗ trợ tùy thuộc vào bản phát hành SDK đã cài đặt.

  • SpongeTorch là phiên bản PyTorch của thư viện nén model SpongeKit của Ambarella (thư viện này cũng có các phiên bản Caffe và TensorFlow), được tích hợp vào bản fork Ultralytics của Ambarella để thực hiện pruning không cấu trúc trong quá trình huấn luyện (QAT dự kiến sẽ có trong bản phát hành tương lai). Đây là thành phần tùy chọn: model ONNX xuất theo cách thông thường từ Ultralytics cũng có thể được biên dịch bằng công cụ biên dịch SDK; các công cụ này tự thực hiện lượng tử hóa, nhưng sẽ làm giảm phần nào hiệu năng runtime và độ chính xác sau lượng tử hóa.

  • Các thành phần này là độc quyền và không có trên PyPI. Đăng ký tại Ambarella Developer Zone để yêu cầu quyền truy cập SDK; SDK bao gồm công cụ biên dịch (có cvflowbackend), còn wheel spongetorch được phân phối riêng kèm theo.

  • Chạy yolo val model=model.ambapb.ckpt.onnx data=your_data.yaml sau khi cài bản fork Ambarella. Backend AmbaPB thực thi model đã biên dịch như khi chạy trên engine AI CVflow, do đó mAP được báo cáo bao gồm mọi ảnh hưởng từ lượng tử hóa của compiler.

Bình luận