NVIDIA Metropolis và DeepStream SDK: Giải pháp AI nhanh chóng cho tầm nhìn

Cần những gì để tạo ra quy trình tầm nhìn AI bằng cách sử dụng các công cụ hiện đại trên nền tảng Dell?

Blog này mô tả cách triển khai tính năng phát hiện đối tượng từ luồng video qua webcam. Các bước bao gồm:

  • Cài đặt phần mềm DeepStream với bộ chứa Docker
  • Xử lý đầu ra Giao thức truyền phát thời gian thực (RTSP) của webcam
  • Phát hiện các vật thể (người, ô tô, biển báo, xe đạp) trong từng khung hình gần như thời gian thực
  • Vẽ các hộp giới hạn có mã định danh xung quanh các đối tượng
  • Truyền phát đầu ra bằng RTSP

NVIDIA Metropolis là một khung ứng dụng với một bộ công cụ dành cho nhà phát triển nằm trong hệ sinh thái đối tác. Nó có các công cụ và SDK được tăng tốc GPU để xây dựng, triển khai và mở rộng quy mô các ứng dụng phân tích video và Internet of Things (IoT) hỗ trợ AI một cách tối ưu.

Blog này tập trung vào NVIDIA DeepStream, một trong những SDK của NVIDIA Metropolis stack. NVIDIA DeepStream SDK là bộ công cụ phân tích phát trực tuyến hoàn chỉnh để xử lý đa cảm biến, hiểu video, âm thanh và hình ảnh dựa trên AI. Các nhà phát triển có thể sử dụng DeepStream SDK để tạo quy trình xử lý luồng kết hợp mạng thần kinh và các tác vụ xử lý phức tạp khác như theo dõi, mã hóa và giải mã video, trình trung chuyển tin nhắn IOT và kết xuất video. DeepStream bao gồm một dự án Gstreamer mã nguồn mở .

Các thành phần và giải pháp dựa trên Metropolis hỗ trợ các giải pháp AI áp dụng cho nhiều ngành như sản xuất, bán lẻ, chăm sóc sức khỏe và thành phố thông minh trong hệ sinh thái biên.

Hình dưới đây cho thấy khung NVIDIA Metropolis:

Khung NVIDIA Metropolis bao gồm các giai đoạn sau:

Tạo ─Giai đoạn bắt nguồn hình ảnh, luồng video và dữ liệu. Dữ liệu có thể là dữ liệu thời gian thực hoặc dữ liệu tổng hợp được tạo bằng cách sử dụng các công cụ Tạo dữ liệu tổng hợp (SDG). Các công cụ của NVIDIA như NVIDIA Omniverse Replicator phù hợp với giai đoạn này của quy trình.

Đào tạo ─Giai đoạn sử dụng dữ liệu từ giai đoạn Tạo để đưa vào các mô hình được huấn luyện trước và cho phép điều chỉnh mô hình được tăng tốc. Các mô hình được phát triển từ các khung AI tiêu chuẩn như TensorFlow và PyTorch được sử dụng trong giai đoạn này và tích hợp vào quy trình làm việc của khung Metropolis. Bộ công cụ NVIDIA Train, Adapt và Optimize (TAO) là SDK phát triển mô hình AI mã thấp giúp điều chỉnh các mô hình được đào tạo trước.

Xây dựng ─Giai đoạn của quy trình trong đó chức năng cốt lõi của quy trình Vision AI được thực hiện. Giai đoạn Xây dựng của quy trình bao gồm bộ công cụ lưu trữ video NVIDIA, DeepStream , TensorRT, Triton và Metropolis Microservices. Các thư viện và chức năng trong các thành phần SDK này cung cấp các khả năng như codec video, phân tích phát trực tuyến, tối ưu hóa suy luận, thư viện thời gian chạy và dịch vụ suy luận.

Triển khai ─Giai đoạn triển khai các giải pháp AI được đóng gói vào môi trường sản xuất ở biên hoặc đám mây. Việc triển khai các giải pháp AI được đóng gói sử dụng các công nghệ điều phối vùng chứa tiêu chuẩn ngành như Kubernetes và Docker.

Thiết lập thử nghiệm

Thiết lập thử nghiệm bao gồm phần cứng sau:

Lưu ý : Không cần hai máy chủ. Chúng tôi đã chạy bản demo trên cả hai máy chủ để kiểm tra các cấu hình khác nhau. Phần cứng này đã có sẵn trong phòng thí nghiệm; chúng tôi khuyên dùng phần cứng mới nhất để có hiệu suất tốt nhất.

Thiết lập thử nghiệm bao gồm các phần mềm sau:

Hình dưới đây cho thấy một cấu hình ví dụ:

Ảnh chụp màn hình máy tính của máy chủ máy tínhMô tả được tạo tự động

Cài đặt NVIDIA CUDA

Việc kích hoạt bộ công cụ CUDA trên hệ điều hành Ubuntu Linux cơ bản sẽ cung cấp các trình điều khiển và công cụ cần thiết để truy cập GPU NVIDIA.  

Các yêu cầu để cài đặt bộ công cụ CUDA bao gồm:

  • GPU có khả năng CUDA trên nền tảng chạy hệ điều hành Linux cơ bản
  • Phiên bản được hỗ trợ của trình biên dịch và chuỗi công cụ GCC trên hệ điều hành Linux
  • Bộ công cụ CUDA
  1. Cài đặt trình biên dịch GCC cũng như các chuỗi và thư viện công cụ dành cho nhà phát triển khác:
    cập nhật ssudo apt-get
    ssudo apt-get cài đặt build-essential
  2. Xác minh rằng cài đặt thành công:
    gcc --version
  3. Cài đặt bộ công cụ NVIDIA GPU CUDA và Bộ công cụ NVIDIA Container:
    sudo sh NVIDIA-Linux-x86_64-515.76.run

    Lưu ý : Đối với hệ thống PowerEdge có GPU NVIDIA A16, phiên bản mới nhất của bộ công cụ CUDA 12.2 không hoạt động bình thường. Sau khi cài đặt, công cụ nvidia-smi không thể xác định GPU và kích hoạt trình điều khiển. Do đó, chúng tôi đã chọn phiên bản cũ hơn của runfile (trình cài đặt cục bộ) để cài đặt gói bộ công cụ CUDA. Chúng tôi đã sử dụng CUDA Phiên bản 11.7 với phiên bản trình điều khiển 515.76. Tệp được sử dụng là NVIDIA-Linux-x86_64-515.76.run .

  4. Sau khi cài đặt bộ công cụ CUDA, hãy xem đầu ra nvidia-smi để biết chi tiết về GPU trên hệ thống:
    nvidia-smi

Cài đặt thời gian chạy Docker

Các bước sau đây mô tả cách bật thời gian chạy bộ chứa Docker trên hệ điều hành cơ sở và cho phép truy cập vào GPU từ môi trường bộ chứa. Với việc phát hành Docker 19.03 trở lên, các gói nvidia-docker2 không còn cần thiết để truy cập GPU NVIDIA từ môi trường vùng chứa Docker vì chúng được hỗ trợ nguyên bản trong thời gian chạy Docker.

Thực hiện các bước sau trong Ubuntu 20.04:

  1. Cập nhật chỉ mục gói apt và cho phép Công cụ đóng gói nâng cao (APT) sử dụng kho lưu trữ qua HTTPS:
    cập nhật sudo apt-get
    ssudo apt-get cài đặt ca-chứng chỉ Curl gnupg
  2. Thêm khóa GPG chính thức của Docker:
    cài đặt sudo -m 0755 -d /etc/apt/keyrings
    cuộn tròn -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    sudo chmod a+r /etc/apt/keyrings/docker.gpg
  3. Thiết lập kho lưu trữ:
    tiếng vang sudo\
     "deb [arch="$(dpkg --print-architecture)" signature-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
     "$(. /etc/os-release && echo "$VERSION_CODENAME")" ổn định" | \
    sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  4. Cập nhật chỉ mục gói apt:
    cập nhật sudo apt-get
  5. Cài đặt phiên bản mới nhất của công cụ Docker:
    sudo apt-get cài đặt docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  6. Xác minh rằng Docker đã được cài đặt:
    sudo docker chạy xin chào thế giới

Sau khi cài đặt công cụ Docker, hãy cài đặt Bộ công cụ NVIDIA Container và kích hoạt thời gian chạy NVIDIA thành thời gian chạy Docker. Bước này làm cho GPU có thể được phát hiện trong vùng chứa Docker.  

  1. Thiết lập kho lưu trữ gói và khóa GPG:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
       && cuộn tròn -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
       && Curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

Sau khi cài đặt các nguồn kho lưu trữ, hãy thực hiện các bước sau:

  1. Cập nhật danh sách kho lưu trữ:
    cập nhật sudo apt-get
  2. Cài đặt Bộ công cụ chứa NVIDIA:
    cài đặt sudo apt-get -y nvidia-container-toolkit
  3. Định cấu hình trình nền Docker để nhận dạng NVIDIA Container Runtime:
    Cấu hình thời gian chạy sudo nvidia-ctk --runtime=docker
  4. Đặt thời gian chạy mặc định và sau đó khởi động lại trình nền Docker để hoàn tất quá trình cài đặt:
    sudo systemctl khởi động lại docker
  5. Xác minh rằng GPU có thể nhìn thấy được từ bên trong vùng chứa:
    sudo docker run –rm –runtime=nvidia –gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

    Hình dưới đây cho thấy đầu ra NVIDIA SMI:

Chạy vùng chứa Docker DeepStream

Để chạy Bộ chứa Docker DeepStream, hãy thực hiện các bước sau:

  1. Lấy bộ chứa docker DeepStream:
    sudo docker kéo nvcr.io/nvidia/deepstream:6.2-devel

    Tại thời điểm viết blog này, phiên bản mới nhất là v6.2. Vì thùng chứa lớn nên chúng tôi khuyên bạn nên kéo thùng xuống trước khi sử dụng. Phải mất vài phút để tải xuống đầy đủ tất cả các lớp vùng chứa.

  2. Khi vùng chứa được tải xuống đầy đủ, hãy chạy:
    sudo docker run --gpus all -it --rm -p 8554:8554 nvcr.io/nvidia/deepstream:6.2-devel

    Lệnh này hướng dẫn Docker sử dụng bất kỳ GPU nào mà nó phát hiện, chạy tương tác, tự xóa khi kết thúc và mở cổng 8554 cho luồng đầu ra RTSP.

    Khi lệnh chạy, đầu ra sau cho biết vùng chứa Docker có thể truy cập được và ở chế độ tương tác:

    root@9cfa2cfeb11b:/opt/nvidia/deepstream/deepstream-6.2#

Định cấu hình DeepStream bên trong Docker Container

Trong vùng chứa Docker, thực hiện thay đổi cấu hình để bản demo chạy đúng cách.

  1. Cài đặt các phụ thuộc cần thiết:
    /opt/nvidia/deepstream/deepstream/user_bổ sung_install.sh

    Kết quả đầu ra là dài. Ví dụ sau đây cho thấy sự bắt đầu của đầu ra của quá trình cài đặt thành công:

    Nhận: 1 tệp:/var/nv-tensorrt-local-repo-ubuntu2004-8.5.2-cuda-11.8 InRelease [1575 B]
    Nhận: 1 tệp:/var/nv-tensorrt-local-repo-ubuntu2004-8.5.2-cuda-11.8 InRelease [1575 B]
    Lượt truy cập:2  http://archive .ubuntu.com/ubuntu InRelease tiêu điểm

    Ví dụ sau đây cho thấy kết quả đầu ra của quá trình cài đặt thành công:

    Đang thiết lập libavfilter7:amd64 (7:4.2.7-0ubuntu0.1) ...
    Đang thiết lập libavresample-dev:amd64 (7:4.2.7-0ubuntu0.1) ... 
    Đang xử lý trình kích hoạt cho libc-bin (2.31-0ubuntu9.9) ...

    Khi chúng tôi không thực hiện bước này và thử chạy bản demo, chúng tôi nhận được thông báo lỗi sau, đây là lỗi phổ biến được báo cáo trên bảng tin:

    (gst-plugin-scanner:12): GStreamer-CẢNH BÁO **: 18:35:29.078: Không thể tải plugin '/usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstchromaprint.so': libavcodec.so .58: không thể mở tệp đối tượng dùng chung: Không có tệp hoặc thư mục như vậy
    
    (gst-plugin-scanner:12): GStreamer-CẢNH BÁO **: 18:35:29.110: Không thể tải plugin '/usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstmpeg2dec.so': libmpeg2.so .0: không thể mở tệp đối tượng dùng chung: Không có tệp hoặc thư mục như vậy
    (gst-plugin-scanner:12): GStreamer-CẢNH BÁO **: 18:35:29.111: Không thể tải plugin '/usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstmpeg2enc.so': libmpeg2encpp-2.1 .so.0: không thể mở tệp đối tượng dùng chung: Không có tệp hoặc thư mục như vậy
    (gst-plugin-scanner:12): GStreamer-CẢNH BÁO **: 18:35:29.112: Không thể tải plugin '/usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstmpg123.so': libmpg123.so .0: không thể mở tệp đối tượng dùng chung: Không có tệp hoặc thư mục như vậy
    (gst-plugin-scanner:12): GStreamer-CẢNH BÁO **: 18:35:29.117: Không thể tải plugin '/usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstopenmpt.so': libmpg123.so .0: không thể mở tệp đối tượng dùng chung: Không có tệp hoặc thư mục như vậy
    (gst-plugin-scanner:12): GStreamer-CẢNH BÁO **: 18:35:31.675: Không thể tải plugin '/usr/lib/x86_64-linux-gnu/gstreamer-1.0/deepstream/libnvdsgst_inferserver.so': libtritonserver .so: không thể mở tệp đối tượng dùng chung: Không có tệp hoặc thư mục như vậy
    (gst-plugin-scanner:12): GStreamer-CẢNH BÁO **: 18:35:31.699: Không thể tải plugin '/usr/lib/x86_64-linux-gnu/gstreamer-1.0/deepstream/libnvdsgst_udp.so': librivermax .so.0: không thể mở tệp đối tượng dùng chung: Không có tệp hoặc thư mục như vậy
    ** LỖI: <create_udpsink_bin:644>: Không tạo được 'sink_sub_bin_encoding1'
    ** LỖI: <create_udpsink_bin:719>: create_udpsink_bin không thành công
    ** LỖI: <create_sink_bin:828>: create_sink_bin không thành công
    ** LỖI: <create_processing_instance:884>: create_processing_instance không thành công
    ** LỖI: <create_pipeline:1485>: create_pipeline không thành công
    ** LỖI: <main:697>: Không tạo được đường dẫn
    Đang bỏ cuộc
    Chạy ứng dụng không thành công
  2. Thay đổi thư mục và chỉnh sửa tập tin cấu hình:
    mẫu cd
    
    cấu hình vim/deepstream-app/source30_1080p_dec_infer-resnet_tiled_display_int8.txt
  3. Tìm các mục sau:
    [màn hình lát gạch]
    bật=1
  4. Thay đổi  Enable=1 thành  Enable=0 .
    Màn hình không có ô xếp giúp việc so sánh luồng video webcam trước và sau dễ dàng hơn.
  5. Tìm các mục sau:
    [nguồn0] 
    bật=1 
    #Type - 1=CameraV4L2 2=URI 3=MultiURI 4=RTSP 
    loại=3
    uri=file://../../streams/sample_1080p_h264.mp4
  6. Thay đổi:
    •  type=3 thành type=4
    •  uri thành uri=rtsp://192.168.10.210:554/s0
    Lưu ý : URI này dành cho webcam đang phát trực tuyến.
  7. Tìm các mục sau:|
    [nguồn1] 
    bật=1
  8. Thay đổi  Enable=1 thành Enable=0 .
  9. Tìm các mục sau:
    [chìm0]
    bật=1
  10. Thay đổi Enable=1 thành Enable=0 .
  11. Tìm các mục sau:
    [chìm2] 
    bật=0 
    #Type - 1=FakeSink 2=EglSink 3=Tệp 4=RTSPStreaming 
    gõ=4
    #1=h264 2=h265 
    codec=1
    #loại bộ mã hóa 0=Phần cứng 1=Phần mềm 
    loại enc=0
  12. Thay đổi:
    • Enable=0 thành Enable=1
    •enc-type=0  thành  enc-type=1
    Lưu ý : Mục enc-type=1 thay đổi cấu hình để sử dụng bộ mã hóa phần mềm thay vì phần cứng. Chúng tôi đã thay đổi mục nhập vì hệ thống demo của chúng tôi có GPU NVIDIA A100 không có bộ mã hóa phần cứng. Tốt nhất, hãy giữ mục này là enc-type=0 nếu có sẵn bộ mã hóa phần cứng. Với GPU NVIDIA A16, chúng tôi đã sử dụng mục nhập enc-type=0. Ma trận hỗ trợ GPU mã hóa và giải mã video tại  https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new hiển thị hỗ trợ bộ mã hóa và phần cứng GPU.

    Nếu bạn không thay đổi mục enc-type=1 (bộ mã hóa phần mềm), thông báo lỗi sau có thể được hiển thị:

    LỖI từ sink_sub_bin_encode1: Không thể nhận/đặt cài đặt từ/trên tài nguyên.
    Thông tin gỡ lỗi: gstv4l2object.c(3511): gst_v4l2_object_set_format_full ():
    /GstPipeline:pipeline/GstBin:processing_bin_0/GstBin:sink_bin/GstBin:sink_sub_bin1/nvv4l2h264enc:sink_sub_bin_encode1:
    Thiết bị đang ở chế độ phát trực tuyến
  13. Lưu tệp và thoát khỏi trình chỉnh sửa.

Chạy bản demo

Để chạy bản demo:

  1. Trong vùng chứa, khởi động DeepStream để chạy với cấu hình mới. Lệnh này phải nằm trên một dòng.
    deepstream-app -c configs/deepstream-app/source30_1080p_dec_infer-resnet_tiled_display_int8.txt
  2. Tìm văn bản sau trong thông báo cảnh báo được hiển thị:
    *** DeepStream: Đã ra mắt RTSP Streaming tại rtsp://localhost:8554/ds-test ***

    Mặc dù thông báo cho biết DeepStream được liên kết với localhost nhưng nó vẫn có thể truy cập được từ xa nhờ lệnh cổng Docker đã được sử dụng trước đó.
    Sau khi hiển thị thêm văn bản và thông báo cảnh báo, đầu ra sau cho biết phần mềm đã khởi động và đang xử lý đầu vào video từ webcam:

    Các lệnh thời gian chạy: 
            h: In phần trợ giúp này
            q: Bỏ cuộc 
            p: Tạm dừng
            r: Tiếp tục
    
    **PERF: FPS 0 (Trung bình) 
    **PERF: 0,00 (0,00) 
    ** THÔNG TIN: <bus_callback:239>: Đường ống đã sẵn sàng 
    
    ** LỖI: <cb_newpad3:510>: Không thể liên kết trình tải depay với rtsp src 
    ** THÔNG TIN: <bus_callback:225>: Đường ống đang chạy 
    
    **PERF: 30,89 (30,89) 
    **PERF: 30,00 (30,43)
    **PERF: 30,00 (30,28)

Xem bản demo

Để xem bản demo:

  1. Trên máy tính xách tay, hãy khởi động trình phát media. Chúng tôi sử dụng trình phát đa phương tiện VLC.
  2. Nhấp vào Phương tiện , sau đó trong danh sách thả xuống, chọn  Mở luồng mạng… , như minh họa trong hình sau:
  3. Nhập địa chỉ IP của hệ thống Linux nơi vùng chứa đang chạy. 
    Lưu ý: Địa chỉ IP trong hình dưới đây là một ví dụ. Sử dụng địa chỉ IP thích hợp cho việc triển khai của bạn.
  4. Nhấp vào Chơi .

Trong vài giây, webcam sẽ truyền phát video xác định các đối tượng có hộp giới hạn được áp dụng trong thời gian gần như thực. Bản demo này phát hiện người, ô tô, biển báo và xe đạp. 

Hình sau đây là ví dụ hiển thị đầu ra video của các đối tượng được nhận dạng:

Lưu ý : Mô hình không được đào tạo để phát hiện động vật và phát hiện chính xác người và ô tô .

Bản tóm tắt

Trong blog này, chúng tôi đã xem xét quá trình thiết lập thử nghiệm cấu hình phần cứng Metropolis DeepStream, các bước cài đặt phần mềm và cách sử dụng DeepStream để tạo quy trình AI tầm nhìn chung với máy chủ Dell. Chúng tôi đã bao gồm các hướng dẫn chi tiết để bạn có thể hiểu sâu hơn về cấu hình và tính dễ sử dụng.

Chúng tôi hy vọng bạn thích thú khi theo dõi hành trình DeepStream của chúng tôi.