Ultralytics tăng tốc các model YOLO trên chip yêu thích của bạn như thế nào
Ultralytics tối ưu các model YOLO để tăng tốc trên CPU, GPU và thiết bị edge như thế nào. Chúng tôi sẽ giải thích về chip, bộ nhớ và các kỹ thuật thông minh như quantization, fusion và pruning.

Tại Ultralytics, chúng tôi tạo ra các model thị giác máy tính; về cơ bản, chúng tôi dạy máy tính cách nhìn! Hãy hình dung các model này như những công thức toán học khổng lồ. Chúng gồm các phép toán (chúng tôi gọi là các layer) và một lượng số khổng lồ mà chúng tôi gọi là các weight.
Các model Ultralytics YOLO của chúng tôi xử lý hình ảnh đúng bản chất của chúng: các mảng số! Mỗi pixel thực chất chỉ là các giá trị màu, tức lượng Đỏ, Xanh lá và Xanh dương (do đó là RGB) tại từng điểm tạo nên hình ảnh. Chúng tôi gọi các mảng số này là “tensor” vì nghe ngầu hơn nhiều so với “ma trận đa chiều”, vốn lại nghe ngầu hơn nhiều so với “các số được xếp chồng lên các số, rồi lại chồng lên các số”.
Khi bạn đưa một hình ảnh vào model, nó bắt đầu một hành trình phi thường qua network. Hãy hình dung tensor của bạn lướt qua hết layer này đến layer khác, được biến đổi, tích chập và xử lý bằng toán học theo cách đẹp đẽ nhất có thể. Nó giống như một bữa tiệc khiêu vũ, nơi các con số hòa trộn và tương tác, chắt lọc bản chất tạo nên một con mèo hay một chiếc xe. Chúng tôi gọi quá trình này là trích xuất đặc trưng.
Điều gì xuất hiện ở đầu ra? Thêm nhiều con số! Những con số có ý nghĩa. Trong các tác vụ detection, chúng cho bạn biết chính xác vật thể nằm ở đâu trong hình ảnh và đó có thể là vật gì. “Này, có 95% khả năng đó là một con chó tại tọa độ (x, y)!” Chúng tôi gọi quá trình kỳ diệu này là inference.
Tuy nhiên, trước khi các model có thể phát huy phép thuật, chúng cần đến trường; chúng cần được train. Giai đoạn training là lúc mọi thứ trở nên căng thẳng.
Trong quá trình training, mỗi khi đưa một hình ảnh cho network, chúng tôi không chỉ nhận một câu trả lời. Chúng tôi thực hiện hai việc cực kỳ nặng. Thứ nhất, chúng tôi tính xem network đã sai đến đâu (chúng tôi gọi đó là loss, về cơ bản là khoảng cách tới hồng tâm). Thứ hai, và đây mới là phần quan trọng, chúng tôi cập nhật từng con số (hay weight) trong network dựa trên loss đó. Hãy hình dung việc này như tinh chỉnh hàng nghìn núm vặn nhỏ cùng lúc, trong đó mỗi điều chỉnh được tính toán để giúp network chính xác hơn sau mỗi lần.
Về cơ bản, chúng tôi train network thông qua việc sửa sai: mỗi lỗi dạy cho nó biết điều KHÔNG nên làm, và chúng tôi tinh chỉnh toàn bộ weight để khi gặp lại một hình ảnh tương tự, nó sẽ tiến gần hơn đến câu trả lời đúng. Nói cách khác, network học bằng cách được đẩy từng chút theo đúng hướng, qua từng lỗi, cho đến khi bắt đầu dự đoán chính xác.
Chúng ta đang nói đến bao nhiêu con số? YOLO11n nhỏ bé của chúng tôi có vài triệu parameter. Nhưng YOLO11x thì sao? Model mạnh mẽ đó có hơn 50 triệu parameter! Nhiều parameter hơn đồng nghĩa với việc bạn có thể mã hóa nhiều chi tiết hơn, giống như sự khác biệt giữa vẽ bằng sáp màu và sở hữu cả một bảng màu đầy đủ của họa sĩ.
Trong inference, số lượng parameter trở nên cực kỳ quan trọng. Chạy một network 3 triệu parameter giống như chạy bộ quanh khu nhà. Chạy một network 50 triệu parameter? Giống như chạy marathon trong khi tung hứng những ngọn đuốc đang cháy.
Vậy chính xác thì computation là gì? Tất cả việc xử lý những con số này thực sự diễn ra như thế nào? Làm sao chúng ta tăng tốc nó? Và “tối ưu hóa computation” thực sự có nghĩa là gì?
Các chip thực sự thực hiện phép toán như thế nào#
Computation diễn ra nhờ các chip. Những ô silicon nhỏ này về cơ bản là những lâu đài cát có tổ chức nhất trong vũ trụ. Mọi thao tác máy tính thực hiện, mọi phép cộng, mọi phép so sánh, mọi câu lệnh “nếu điều này thì điều kia”, đều được khắc vật lý vào silicon. Có các mạch vật lý thực sự tại những khu vực cụ thể trên chip dành riêng cho việc cộng số, và các mạch khác dành cho những phép toán logic. Nó giống như một thành phố tí hon, nơi các khu phố khác nhau chuyên về những loại toán học khác nhau.
Điều này có lẽ nghe thật kỳ quặc, ngay cả khi bạn là một computer scientist. Đó là vì trong 40 năm qua, chúng ta đã xây dựng hết layer abstraction này đến layer abstraction khác, giống như một món lasagna công nghệ đã cao đến mức không còn nhìn thấy lớp đĩa bên dưới. Chúng ta đã đơn giản hóa mọi thứ đến mức phần lớn programmer ngày nay không biết computation thực sự diễn ra trong silicon như thế nào. Không phải do lỗi của họ, mà là do thiết kế!
Hãy bóc tách các layer này. Xét đoạn code Python đơn giản đến mức không thể đơn giản hơn:
x = 1
if x == 1:
y = x + 1Chúng ta tạo một biến x, đặt giá trị của nó bằng 1, và nếu x bằng 1 (bật mí: đúng là như vậy), chúng ta tạo y với giá trị bằng x cộng 1. Ba dòng. Dễ dàng.
Nhưng đây mới là phần thú vị. Giữa ba dòng code vô hại đó và các electron thực sự chuyển động qua silicon, có ÍT NHẤT bốn layer dịch khổng lồ đang diễn ra (thực tế còn nhiều hơn, nhưng Digital Content Manager của chúng tôi nói rằng số từ hiện tại đã khiến cô ấy lo lắng). Hãy để tôi dẫn bạn qua hành trình đầy choáng ngợp này:
Layer 1: Python → Bytecode Trước tiên, Python đọc code của bạn và biên dịch nó thành thứ gọi là bytecode, một ngôn ngữ trung gian dễ được máy tính tiếp nhận hơn nhưng có thể khiến mắt bạn chảy máu nếu cố đọc.
Layer 2: Bytecode → Machine Code Python interpreter (chẳng hạn CPython) nhận bytecode đó và dịch nó thành machine code, tức các instruction thực sự mà processor của bạn hiểu được. Đây là lúc câu lệnh “if x == 1” thanh lịch trở thành thứ gì đó như “LOAD register, COMPARE register, JUMP if zero flag set.”
Layer 3: Machine Code → Microcode Cú twist! Các processor hiện đại thậm chí không thực thi machine code trực tiếp. Chúng tiếp tục phân rã nó thành microcode, những phép toán còn nhỏ hơn mà các thành phần bên trong chip có thể xử lý. Một instruction “ADD” đơn lẻ của bạn có thể trở thành nhiều micro-operation.
Layer 4: Microcode → Physical Electronics Cuối cùng, chúng ta chạm đến silicon. Các micro-operation đó kích hoạt những tín hiệu điện thực sự chạy qua các transistor. Hàng tỷ công tắc nhỏ bật tắt, electron chuyển động qua các đường dẫn được thiết kế cẩn thận, và bằng cách nào đó, một cách kỳ diệu, 1 + 1 trở thành 2.
Mỗi layer tồn tại để che giấu sự phức tạp điên rồ của layer bên dưới. Nó giống những búp bê lồng vào nhau của Nga, ngoại trừ việc mỗi búp bê nói một ngôn ngữ hoàn toàn khác nhau, còn búp bê nhỏ nhất thực sự được tạo nên từ tia chớp bị mắc kẹt trong cát.
Điều mỉa mai là gì? Ba dòng Python đó có thể kích hoạt HÀNG TRIỆU công tắc transistor. Nhưng nhờ các abstraction này, bạn không cần suy nghĩ về bất kỳ điều gì trong số đó. Bạn chỉ cần viết “y = x + 1” và tin rằng đâu đó sâu trong silicon, phép màu sẽ xảy ra.
Architecture#
Mọi phép toán đều được triển khai vật lý trong silicon, và NƠI nó diễn ra trên chip hoàn toàn phụ thuộc vào topology của chip. Nó giống như quy hoạch thành phố, nhưng dành cho các electron. Bộ cộng ở đây, bộ nhân ở kia, và tất cả cần giao tiếp với nhau một cách hiệu quả.
Có hàng trăm chip khác nhau trên thị trường, mỗi loại được thiết kế cho những mục đích khác nhau. Điều gì thay đổi giữa chúng? Topology, tức cách các phép toán được bố trí và triển khai trong miền vật lý. Đây là thứ chúng ta gọi là architecture, và quả thực có rất nhiều loại:
- x86 (Intel và AMD) - Ông tổ của điện toán desktop, phức tạp nhưng mạnh mẽ
- ARM - Cung cấp sức mạnh cho điện thoại và ngày càng nhiều laptop, được thiết kế để đạt hiệu quả cao
- RISC-V - Kẻ nổi loạn mã nguồn mở, đang ngày càng phổ biến ở khắp nơi
- PowerPC - Quái thú của IBM, vẫn đang vận hành trong các game console và server
- MIPS - Lựa chọn yêu thích của giới học thuật, đơn giản và thanh lịch
- SPARC - Đóng góp của Sun Microsystems (nay thuộc Oracle) cho điện toán hiệu năng cao
- GPU architectures (các CUDA core của NVIDIA, RDNA của AMD) - Những quái vật xử lý song song
Mỗi architecture không chỉ sắp xếp transistor theo cách khác nhau mà còn nói một ngôn ngữ khác nhau. Các abstraction chúng ta dùng để gửi instruction đến những máy này hoàn toàn khác biệt. Nó giống như phải viết chỉ đường cho một người, nhưng tùy vào chiếc xe của họ, bạn có thể phải viết bằng tiếng Pháp, tiếng Quan Thoại hoặc bằng điệu múa diễn giải.
Nhịp đập của silicon#
Nhiên liệu của chip là electron, dòng điện chảy vào chip và cung cấp năng lượng cho computation. Nhưng chỉ năng lượng thôi là chưa đủ. Để chip thực sự hoạt động và di chuyển data qua topology phức tạp của nó, mọi thứ phụ thuộc vào một thành phần then chốt: clock. Đây là thứ khiến electron chảy qua những đường dẫn cụ thể vào những thời điểm cụ thể. Nếu không có nó, bạn chỉ có silicon được cấp điện nhưng không làm gì cả.
Hãy tưởng tượng việc cố gắng điều phối một màn trình diễn khổng lồ, nơi hàng tỷ thành phần cần chuyển động đồng bộ hoàn hảo. Không có nhịp, mọi thứ sẽ hỗn loạn. Đó chính xác là chức năng của clock đối với processor. Nó là một tinh thể rung động với tần suất cực kỳ ổn định, phát ra các xung điện hàng tỷ lần mỗi giây.
Khi nghe nói “processor 3.5 GHz”, GHz (gigahertz) đó là tốc độ clock, tức 3,5 tỷ nhịp mỗi giây. Mỗi nhịp được gọi là một clock cycle, và đây là đơn vị thời gian cơ bản trong điện toán.
KHÔNG CÓ GÌ xảy ra giữa các clock cycle. Toàn bộ máy tính đóng băng, chờ nhịp tiếp theo. Nó giống như trò “đèn đỏ, đèn xanh” khắc nghiệt nhất vũ trụ. Trong mỗi “đèn xanh” (xung clock):
- Data di chuyển giữa các thành phần
- Các phép tính được thực thi
- Các quyết định logic được đưa ra
- Memory được đọc hoặc ghi
Một số phép toán mất một cycle (phép cộng đơn giản), trong khi các phép khác mất nhiều cycle (phép chia hoặc lấy data từ RAM). Mọi thứ được biên đạo chính xác, với hàng tỷ thành phần thực hiện các phép toán riêng, tất cả đồng bộ theo nhịp không ngừng nghỉ này.
Bạn có thể overclock processor bằng cách khiến tinh thể rung nhanh hơn; mọi thứ diễn ra nhanh hơn, nhưng nó cũng tạo ra nhiều nhiệt hơn và trở nên kém ổn định hơn. Đẩy quá xa, máy tính của bạn sẽ crash vì các electron thực sự không thể theo kịp nhịp.
Ngày trước, những phép toán này được triển khai bằng các cỗ máy có kích thước bằng cả căn phòng. Nhưng các thành phần thực hiện toàn bộ computation này lại đơn giản đến kinh ngạc: chúng chỉ là các công tắc. Công tắc bật hoặc tắt.
Nối đủ các công tắc này với nhau theo đúng pattern, bạn sẽ có computation. Toàn bộ cuộc cách mạng kỹ thuật số quy về một cách sắp xếp công tắc tinh vi.
Sự đơn giản này có nghĩa là nếu có công tắc, bất kỳ loại công tắc nào, bạn đều có thể xây dựng một máy tính. Con người đã chế tạo máy tính hoạt động được từ ống nước và van, domino, khối LEGO, viên bi, thậm chí cả redstone trong Minecraft.
Các nguyên lý không thay đổi kể từ thập niên 1940. Chúng ta chỉ ngày càng giỏi hơn trong việc chế tạo những công tắc cực kỳ nhỏ. Điện thoại của bạn có năng lực computation lớn hơn tất cả máy tính từng đưa con người lên Mặt Trăng cộng lại, và nó vừa trong túi bạn vì chúng ta đã tìm ra cách chế tạo công tắc ở quy mô nguyên tử.
Khi chạy các neural network với hàng triệu parameter, chúng ta đang lật những công tắc tí hon này hàng tỷ lần mỗi giây, tất cả đồng bộ hoàn hảo theo nhịp đập tinh thể đó. Mọi lần cập nhật weight, mọi phép nhân ma trận, mọi hàm activation, tất cả đều bước theo nhịp của clock.
Chẳng trách training model khiến máy tính của bạn nghe như đang cố cất cánh!
Khiến Neural Network chạy BRRRRR#
Được rồi, chúng ta có những chip với hàng tỷ công tắc nhảy múa theo nhịp tinh thể, và muốn chạy các neural network với hàng triệu parameter trên đó. Lẽ ra phải dễ, đúng không? Cứ ném các con số vào chip rồi để nó tự xử lý!
Chạy neural network nhanh giống như cố nấu một bữa ăn năm món trong căn bếp mà tủ lạnh cách đó ba dãy nhà, bạn chỉ có một chiếc chảo, và mỗi nguyên liệu nặng 500 pound. Bản thân toán học không phải vấn đề lớn nhất; mọi thứ khác mới là vấn đề.
Sự không tương thích về architecture#
Phần lớn chip được thiết kế để chạy Microsoft Word, không phải neural network. CPU của bạn được xây dựng với suy nghĩ rằng nó sẽ dành cả đời để chạy các câu lệnh if, loop và thỉnh thoảng tính thuế cho bạn (phép tính duy nhất khiến ngay cả siêu máy tính cũng kiệt quệ về mặt cảm xúc). Nó được tối ưu cho các phép toán tuần tự: làm việc này, rồi việc kia, rồi việc tiếp theo.
Nhưng neural network hoàn toàn khác. Chúng muốn làm MỌI THỨ CÙNG LÚC. Trong training, bạn cập nhật hàng triệu weight dựa trên mức độ sai của các dự đoán. Trong inference (thực sự sử dụng model đã train), bạn đẩy data qua hàng triệu phép tính đồng thời. Hãy tưởng tượng bạn cần nhân một triệu số với một triệu số khác. CPU của bạn, dù rất đáng quý, lại muốn làm từng phép một, giống như một kế toán cực nhanh nhưng cực kỳ tuần tự.
Đây là lý do GPU trở thành nền tảng của AI computing. GPU được thiết kế cho game, nơi bạn cần tính màu của hàng triệu pixel đồng thời. Hóa ra việc tính màu pixel và thực hiện phép toán neural network giống nhau một cách đáng ngạc nhiên: cả hai đều liên quan đến việc thực hiện cùng một phép toán trên lượng data khổng lồ theo kiểu song song.
Nhưng ngay cả GPU cũng không hoàn hảo cho neural network. Đó là lý do các công ty hiện đang xây dựng các chip AI chuyên dụng (TPU, NPU và mọi acronym khác kết thúc bằng PU). Những chip này được thiết kế từ đầu với một nhiệm vụ: khiến neural network chạy nhanh. Chúng giống như thuê một đầu bếp chỉ biết nấu một món, nhưng nấu món đó với tốc độ siêu phàm. Trong khi CPU chật vật xử lý các phép toán ma trận theo tuần tự và GPU xử lý chúng khá tốt theo kiểu song song, những chip chuyên dụng này ăn ma trận vào bữa sáng, trưa và tối.
Bức tường memory (Hay: Vì sao di chuyển Bit khó hơn làm toán)#
Trong computation của neural network hiện đại, chúng ta dành nhiều thời gian và năng lượng để DI CHUYỂN data hơn là thực sự COMPUTE với data đó.
Hãy hình dung chip máy tính của bạn như một nhà toán học thiên tài làm việc với tốc độ ánh sáng, nhưng toàn bộ sách tham khảo của họ lại được cất trong những tòa nhà khác nhau ở khắp thành phố. Họ có thể giải bất kỳ phương trình nào ngay lập tức, nhưng trước tiên phải lấy được các con số, và hành trình đó mất rất nhiều thời gian.
Chip của bạn có thể nhân hai số trong một clock cycle (hãy nhớ, đó là một trong hàng tỷ nhịp mỗi giây). Nhanh như chớp! Nhưng việc lấy những con số đó từ memory đến chip? Có thể mất HÀNG TRĂM cycle. Giống như nhà toán học giải một bài toán trong một giây nhưng cần năm phút để đi bộ đến thư viện rồi quay lại.
Lý do là khoảng cách (và không gian). Điện di chuyển nhanh, nhưng không nhanh vô hạn. Data phải đi càng xa trên chip thì càng mất nhiều thời gian. Các nhà thiết kế máy tính giải quyết điều này bằng cách tạo ra hệ thống phân cấp memory, giống như có nhiều địa điểm lưu trữ ở các khoảng cách khác nhau:
- Registers (được tích hợp trực tiếp vào các compute unit): Bàn làm việc của nhà toán học. Truy cập tức thì! Nhưng nó rất nhỏ, bạn chỉ có thể giữ khoảng 32 con số ở đây. Giống như có các mảnh giấy ghi chú ngay trước mặt.
- L1 Cache (cách vài micromet): Giá sách trong văn phòng. Mất 3-4 cycle để lấy dữ liệu. Bạn có thể lưu vài nghìn con số ở đây.
- L2 Cache (cách vài milimet): Tủ hồ sơ ở cuối hành lang. Mất 10-15 cycle và có thể chứa vài triệu con số.
- L3 Cache (ở phía bên kia chip): Phòng lưu trữ ở tầng dưới. Mất 30-50 cycle và chứa hàng chục triệu con số.
- RAM (trên một chip hoàn toàn khác): Nhà kho ở bên kia thành phố. Mất 100-300 cycle. Đây là nơi hàng tỷ con số của bạn được lưu trữ.
- SSD/Hard Drive (kết nối bằng cáp): Một thành phố hoàn toàn khác. Mất hàng triệu cycle. Dung lượng khổng lồ, tốc độ chậm như băng.
Cấu trúc chính xác sẽ khác nhau; chip điện thoại của bạn có thể bỏ qua L3 cache, trong khi CPU server có thể sở hữu dung lượng L3 cache khổng lồ. Tuy nhiên, nguyên lý vẫn giữ nguyên: memory gần hơn thì nhanh hơn nhưng nhỏ hơn.
Đây là lúc neural network trở nên đau đầu. Hãy tưởng tượng model Ultralytics YOLO của bạn có 50 triệu parameter (nhân tiện, ChatGPT có hàng tỷ). Đó là 50 triệu con số cần di chuyển từ memory đến các compute unit rồi quay trở lại. Ngay cả khi mỗi con số chỉ chiếm 4 byte, đó vẫn là 200 megabyte data cần di chuyển trong hệ thống.
Chip có thể xử lý mỗi con số trong một cycle, nhưng nếu mất 100 cycle để lấy con số đó từ RAM, bạn đang dành 99% thời gian để chờ giao hàng. Giống như có một chiếc xe đua Formula 1 mắc kẹt trong tắc đường. Toàn bộ năng lực computation đó chỉ ngồi chờ data đến.
Đây là nhận định then chốt: đây chính là nút thắt cổ chai trong điện toán hiện đại. Nó được gọi là nút thắt cổ chai von Neumann. Làm cho chip tính toán nhanh hơn tương đối dễ. Làm cho memory nhanh hơn thì đang chạm đến các giới hạn vật lý. Đây là lý do gần như MỌI tối ưu hóa hiệu năng trong AI đều diễn ra ở cấp memory. Khi các engineer tăng tốc neural network, họ hiếm khi làm phép toán nhanh hơn; họ tìm những cách thông minh để giảm lượng data phải di chuyển, cache data tốt hơn hoặc truy cập data hiệu quả hơn.
Các chip AI hiện đại không chỉ tập trung vào tốc độ compute; chúng đặc biệt chú trọng đến băng thông memory và các chiến lược di chuyển data. Chúng pre-fetch data, tái sử dụng các value đã có trong cache và tổ chức computation để giảm thiểu số lần truy cập memory. Những bên chiến thắng trong cuộc đua phần cứng AI không phải là bên sở hữu calculator nhanh nhất; đó là bên tìm ra cách giữ cho các calculator luôn được cung cấp đủ data. Toàn bộ cuộc chơi xoay quanh việc tối ưu pattern truy cập memory.
Mỗi lần di chuyển một bit data, bạn tiêu tốn năng lượng. Không nhiều, chúng ta đang nói đến picojoule, nhưng khi di chuyển terabyte mỗi giây, tổng năng lượng sẽ tăng lên RẤT NHANH. Trên thực tế, di chuyển data 1 mm qua chip tiêu tốn nhiều năng lượng hơn cả việc thực hiện computation!
Đây là lý do laptop của bạn kêu như động cơ phản lực khi training neural network. Không phải toán học tạo ra nhiệt; mà là việc di chuyển data. Mỗi lần cập nhật parameter, mỗi lần tính gradient, mỗi forward pass đều thực sự làm nóng căn phòng của bạn.
Các AI accelerator hiện đại về cơ bản là những bài toán về nhiệt động lực học. Chúng ta có thể tích hợp bao nhiêu computation trước khi chip tan chảy? Có thể di chuyển nhiệt ra xa nhanh đến mức nào? Nó giống như overclock, nhưng clock luôn ở mức 11, và chúng ta chỉ cố không châm lửa.
Giải pháp? Thiết kế nhận thức architecture#
Các neural network nhanh nhất không nhất thiết là những network thông minh nhất; chúng là những network được thiết kế có tính đến chip. Chúng:
- Giữ data ở cục bộ nhiều nhất có thể
- Tái sử dụng computation một cách triệt để
- Căn chỉnh hoàn hảo với các khả năng của hardware
- Giảm thiểu việc di chuyển memory bằng mọi giá
Nó giống sự khác biệt giữa một công thức yêu cầu “dùng nguyên liệu từ cửa hàng tạp hóa gần nhà” và một công thức bắt bạn nhập gia vị từ Tây Tạng, phô mai từ Pháp và nước từ Nam Cực. Cả hai có thể đều ngon, nhưng chắc chắn một công thức thực tế hơn.
Và đây là lý do khiến việc làm cho neural network chạy nhanh trở thành một nghệ thuật. Có toán học tốt thôi chưa đủ; bạn cần hiểu hardware, tôn trọng hệ thống phân cấp memory và phối hợp hoàn hảo với architecture.
Chào mừng bạn đến với thế giới nơi computer science gặp physics, engineering và cả phép thuật thuần túy. Nơi di chuyển một con số tốn kém hơn việc tính toán với nó. Nơi xử lý song song thì nhanh, nhưng synchronization lại là tử thần. Nơi kẻ thù lớn nhất của bạn không phải complexity, mà là khoảng cách.
Cách chúng tôi làm YOLO nhanh hơn#
Khi train một model YOLO, bạn có được một neural network hoạt động tuyệt vời trên setup training của mình. Nhưng vấn đề là: gaming GPU, iPhone và con chip nhỏ xíu trong camera an ninh của bạn nói những ngôn ngữ hoàn toàn khác nhau. Chúng có điểm mạnh khác nhau, điểm yếu khác nhau và những quan niệm rất khác nhau về cách xử lý data.
Hãy nghĩ theo cách này: một GPU có hàng nghìn core có thể hoạt động đồng thời – nó được xây dựng cho xử lý song song. Trong khi đó, một chip mobile có thể sở hữu các mạch đặc biệt được thiết kế riêng cho những phép toán AI, nhưng chỉ xử lý được một số loại toán nhất định. Còn edge device trong camera chuông cửa của bạn? Nó đang cố chạy AI với mức công suất nhỏ hơn cả một bóng đèn LED.
Tại Ultralytics, chúng tôi hỗ trợ hơn một chục format export khác nhau vì mỗi format được tối ưu cho những hardware khác nhau. Vấn đề không phải là có quá nhiều lựa chọn. Mà là có đúng lựa chọn cho nhu cầu cụ thể của BẠN.
Fusion operation: Làm nhiều hơn với ít tài nguyên hơn#
Trong model YOLO ban đầu, nhiều phép toán diễn ra theo tuần tự. Ví dụ, chúng ta có thể thực hiện một phép tích chập, sau đó normalize kết quả, rồi áp dụng một hàm activation. Đó là ba bước riêng biệt, mỗi bước đều yêu cầu đọc và ghi memory riêng.
Nhưng đây mới là phần thông minh: chúng ta có thể kết hợp các phép toán này thành một bước duy nhất. Khi export YOLO để deployment, chúng tôi fuse các phép toán lại với nhau. Thay vì:
- Tính phép tích chập → Lưu vào memory
- Load từ memory → Normalize → Lưu vào memory
- Load từ memory → Áp dụng activation → Lưu vào memory
Chúng tôi thực hiện:
- Tính phép tích chập + normalization + activation → Lưu vào memory
Đối với một model YOLO điển hình xử lý hình ảnh 640×640, thủ thuật đơn giản này loại bỏ hàng gigabyte truyền memory không cần thiết. Trên điện thoại mobile, đó là sự khác biệt giữa detection real-time mượt mà và độ trễ gây khó chịu.
Sử dụng các con số nhỏ hơn: Phép màu quantization#
YOLO thực sự không cần các con số có độ chính xác cực cao để phát hiện đối tượng chính xác. Trong quá trình huấn luyện, chúng tôi dùng 32 bit để biểu diễn mỗi trọng số – giống như dùng máy tính khoa học để đo nguyên liệu làm sandwich. Khi triển khai thực tế? 8 bit là hoàn toàn đủ.
Đây được gọi là lượng tử hóa, và đây là một trong những kỹ thuật tối ưu hóa mạnh mẽ nhất của chúng tôi. Bằng cách sử dụng các số nhỏ hơn:
- Model giảm 75% kích thước (từ 200MB xuống 50MB đối với Ultralytics YOLO11x)
- Model chạy nhanh hơn 2–4 lần trên hầu hết thiết bị
- Model tiêu thụ ít điện năng hơn rất nhiều (pin điện thoại của bạn sẽ cảm ơn bạn)
Không phải mọi layer trong YOLO đều nhạy cảm như nhau với việc giảm này. Các layer đầu, có nhiệm vụ phát hiện những cạnh và hình dạng cơ bản? Chúng rất bền vững – chúng ta có thể dùng các số 8 bit mà không gặp vấn đề gì. Các layer phát hiện cuối cùng, quyết định “đây là mèo hay chó?”, cần độ chính xác cao hơn một chút. Vì vậy, chúng tôi điều chỉnh độ chính xác theo từng layer, chỉ dùng số bit vừa đủ để duy trì độ chính xác đồng thời tối đa hóa tốc độ.
Chúng tôi nhận thấy rằng với lượng tử hóa cẩn thận, Ultralytics YOLO vẫn duy trì 99,5% độ chính xác ban đầu trong khi chạy nhanh hơn 3 lần trên điện thoại. Đó là khác biệt giữa một model nghiên cứu và thứ bạn thực sự có thể sử dụng trong thế giới thực.
Lựa chọn algorithm tốt nhất#
Có hàng chục cách khác nhau để thực hiện cùng một phép toán. Một phép tích chập đơn giản (phép toán cốt lõi trong YOLO) có thể được tính bằng các algorithm hoàn toàn khác nhau, và lựa chọn tốt nhất phụ thuộc vào phần cứng cụ thể cũng như kích thước input của bạn.
Khi export YOLO, framework tối ưu hóa của chúng tôi thực sự kiểm thử các algorithm khác nhau và chọn algorithm nhanh nhất cho trường hợp cụ thể của bạn. Điều này giống như có nhiều tuyến đường đến cùng một đích và lựa chọn dựa trên tình trạng giao thông hiện tại. Trên GPU, chúng tôi có thể dùng một algorithm xử lý nhiều pixel đồng thời. Trên CPU, chúng tôi có thể dùng một algorithm được tối ưu cho việc xử lý tuần tự. Phép toán vẫn giống nhau, nhưng chiến lược thực thi hoàn toàn khác biệt.
Memory: Nút thắt cổ chai ẩn#
Bạn còn nhớ chúng ta đã nói memory là nút thắt cổ chai thực sự trong điện toán hiện đại không? Điều này đặc biệt đúng với YOLO. Model có thể có 50 triệu parameter, và trong quá trình inference, nó tạo ra hàng gigabyte kết quả trung gian. Việc di chuyển toàn bộ dữ liệu này thường chậm hơn chính phép tính.
Chúng tôi sử dụng một số thủ thuật để giảm thiểu việc di chuyển memory:
Lập lịch thông minh: Chúng tôi sắp xếp các operation để dữ liệu được sử dụng ngay khi vẫn còn trong cache nhanh. Đối với feature pyramid network của YOLO, cách này giảm 40% lưu lượng memory.
Chia tile: Thay vì xử lý toàn bộ image cùng lúc, chúng tôi chia image thành các tile nhỏ hơn vừa với cache. Nhờ đó, processor có thể làm việc với memory cục bộ, tốc độ cao thay vì liên tục lấy dữ liệu từ memory chính chậm hơn.
Tái sử dụng buffer: Thay vì liên tục cấp phát memory mới cho các kết quả trung gian, chúng tôi tái sử dụng cùng các buffer memory. Cách này cực kỳ hiệu quả – toàn bộ backbone của YOLO có thể chạy chỉ với một nhóm buffer có thể tái sử dụng.
Pruning: Ít hơn là nhiều hơn#
Đây là một sự thật đáng ngạc nhiên: các model YOLO thường được thiết kế quá mức cần thiết. Chúng tôi có thể loại bỏ 30% channel trong nhiều layer mà gần như không ảnh hưởng đến độ chính xác. Đây không chỉ là làm model nhỏ hơn – nó còn làm model nhanh hơn, vì thực sự có ít phép tính hơn cần thực hiện.
Quy trình này rất tinh tế: chúng tôi phân tích những phần nào của network đóng góp ít nhất vào kết quả phát hiện cuối cùng, loại bỏ chúng, sau đó fine-tune model để bù lại. Một model YOLO11m đã pruning có thể nhanh hơn 30% trong khi vẫn duy trì 99% độ chính xác ban đầu. Trên các thiết bị chạy bằng pin, mức tăng hiệu quả này có thể mang lại thêm hàng giờ hoạt động.
Tăng tốc phần cứng: Phát huy thế mạnh của từng chip#
Các processor khác nhau giỏi những việc khác nhau, và chênh lệch hiệu năng rất lớn. Cùng một model YOLO11n cần:
- 45 mili giây mỗi frame trên CPU Intel hiện đại
- 4 mili giây trên GPU NVIDIA RTX
- 22 mili giây trên processor điện thoại cao cấp
- 15 mili giây trên edge TPU Google Coral
Đây không chỉ là khác biệt về tốc độ do xung nhịp – chúng phản ánh những khác biệt căn bản về kiến trúc. GPU có hàng nghìn core hoạt động song song, hoàn hảo cho các phép tích chập của YOLO. NPU di động có các mạch chuyên dụng được thiết kế riêng cho neural network. CPU là thành phần đa năng, linh hoạt nhưng không chuyên biệt.
Chìa khóa của tối ưu hóa là ghép các operation của YOLO với những gì mỗi chip thực hiện tốt nhất. GPU thích thực hiện cùng một operation trên nhiều dữ liệu đồng thời. NPU di động có thể chỉ hỗ trợ một số operation nhất định nhưng thực thi chúng cực kỳ hiệu quả. Edge TPU chỉ hoạt động với số nguyên 8 bit nhưng đạt tốc độ đáng kể trong giới hạn đó.
Ma thuật biên dịch#
Khi bạn export một model YOLO, một điều đáng chú ý diễn ra ở phía sau. Chúng tôi không chỉ chuyển đổi định dạng file – chúng tôi thực sự compile model riêng cho phần cứng đích của bạn. Điều này giống như sự khác biệt giữa Google Translate và người bản ngữ. Quy trình compilation sẽ:
- Phân tích model của bạn để hiểu cấu trúc và yêu cầu của model
- Xem xét khả năng của phần cứng – phần cứng làm tốt gì và gặp khó khăn ở đâu
- Sinh code đã tối ưu sử dụng ngôn ngữ gốc của phần cứng
Compiler có thể tổ chức lại các operation để tận dụng cache của processor tốt hơn, chọn các instruction chuyên dụng mà chip hỗ trợ, hoặc thậm chí dùng machine learning để tìm chiến lược tối ưu hóa tốt nhất. Đúng vậy, chúng tôi đang dùng AI để tối ưu AI – tương lai đã ở đây!
Bước compilation này có thể tạo ra khác biệt hiệu năng gấp 10 lần. Cùng một model YOLO có thể chạy ì ạch với code tổng quát nhưng hoạt động nhanh chóng với các instruction được tối ưu đúng cách.
Triển khai edge trong thế giới thực#
Hãy nói về điều xảy ra khi YOLO bước vào thế giới thực – cụ thể là thế giới đầy thách thức của các thiết bị edge. Hãy hình dung một camera an ninh cần chạy YOLO 24/7 để phát hiện đối tượng. Nó phải đối mặt với các giới hạn khắc nghiệt:
- Memory: Có thể chỉ 512MB đến 2GB RAM tổng cộng
- Điện năng: Thường chỉ 2–5 watt (ít hơn cả bộ sạc điện thoại)
- Tản nhiệt: Không có quạt, chỉ tản nhiệt thụ động
- Độ tin cậy: Phải chạy liên tục mà không bị crash
Đây là những gì tối ưu hóa đạt được trong thực tế. Một camera an ninh chạy YOLO11s:
- Model ban đầu: 15 watt, nóng ở 85°C, đạt 20 FPS
- Được tối ưu bằng lượng tử hóa và pruning: 3 watt, nhiệt độ dễ chịu ở 45°C, đạt 25 FPS
Chúng tôi đã giảm 80% mức tiêu thụ điện năng đồng thời thực sự cải thiện hiệu năng! Đó là khác biệt giữa một thiết bị quá nóng và nhanh hết pin với một thiết bị có thể hoạt động ổn định trong nhiều năm.
Chìa khóa là lựa chọn các đánh đổi phù hợp. Trên thiết bị edge, chúng tôi thường:
- Sử dụng lượng tử hóa INT8 (độ chính xác thấp hơn, tiêu thụ ít điện năng hơn rất nhiều)
- Xử lý ít frame hơn khi mức độ hoạt động thấp
- Phân bổ công việc trên các processor khác nhau để quản lý nhiệt
- Giữ model đủ nhỏ để nằm hoàn toàn trong memory tốc độ cao
Quy trình tối ưu hóa#
Tại Ultralytics, chúng tôi áp dụng phương pháp tối ưu hóa có hệ thống. Trước tiên, chúng tôi profile model để hiểu thời gian thực sự được sử dụng ở đâu. Các nút thắt cổ chai thường không nằm ở nơi bạn dự đoán. Có thể 80% thời gian được dành cho chỉ một vài layer, hoặc việc truyền memory chi phối thời gian tính toán.
Tiếp theo, chúng tôi áp dụng các bước tối ưu hóa lặp đi lặp lại:
- Bắt đầu với các nút thắt cổ chai lớn nhất
- Mỗi lần áp dụng một tối ưu hóa
- Đo cả mức cải thiện tốc độ và ảnh hưởng đến độ chính xác
- Giữ lại các tối ưu hóa mang lại sự đánh đổi hợp lý
- Lặp lại cho đến khi đạt mục tiêu
Ví dụ, với việc triển khai YOLO11m trên điện thoại:
- Baseline: 200ms mỗi frame, model 200MB
- Sau lượng tử hóa: 80ms mỗi frame, model 50MB
- Sau pruning: 60ms mỗi frame, model 35MB
- Sau operation fusion: 45ms mỗi frame, model 35MB
Mỗi bước đều cải thiện hiệu năng trong khi duy trì hơn 99% độ chính xác ban đầu. Kết quả? Phát hiện đối tượng theo thời gian thực trên một thiết bị vừa vặn trong túi của bạn.
Tương lai: Điện toán không đồng nhất#
Các thiết bị hiện đại ngày càng thông minh hơn trong việc sử dụng nhiều processor cùng nhau. Điện thoại của bạn không chỉ có một processor – nó có nhiều processor, mỗi processor được chuyên biệt cho các tác vụ khác nhau:
- Cảm biến camera có ISP (Bộ xử lý tín hiệu hình ảnh) để tiền xử lý
- NPU (Bộ xử lý neural) chạy inference YOLO
- CPU xử lý logic phức tạp và việc điều phối
- GPU render kết quả trên màn hình
Tương lai của việc tối ưu hóa YOLO là phân chia model một cách thông minh giữa các processor này. Có thể NPU xử lý các phép tích chập chính, CPU thực hiện logic phát hiện cuối cùng, còn GPU trực quan hóa kết quả. Mỗi processor làm phần việc mà nó giỏi nhất, tạo ra một pipeline hiệu quả hơn bất kỳ processor đơn lẻ nào có thể đạt được.
Chúng tôi đang phát triển các algorithm phân vùng thông minh, tự động xác định cách tốt nhất để chia YOLO giữa các processor hiện có, không chỉ xét đến khả năng của chúng mà còn xét đến chi phí di chuyển dữ liệu giữa các processor.
Tóm lại#
Tối ưu hóa các model YOLO không chỉ là chuyển đổi định dạng file; đó là biến AI tiên tiến thành thứ thực sự hoạt động trong thế giới thực. Thông qua các kỹ thuật như lượng tử hóa (sử dụng các số nhỏ hơn), pruning (loại bỏ các phần không cần thiết), operation fusion (kết hợp các bước) và quản lý memory thông minh, chúng tôi đạt mức cải thiện hiệu năng gấp 10–100 lần trong khi vẫn duy trì độ chính xác.
Điều đáng chú ý là gì? Không có một phương pháp tối ưu hóa “tốt nhất” cho mọi trường hợp. Một cloud server với nguồn điện không giới hạn cần các tối ưu hóa khác với một drone chạy bằng pin. Điện thoại có chip AI chuyên dụng cần cách xử lý khác với Raspberry Pi. Đó là lý do Ultralytics cung cấp rất nhiều tùy chọn export – mỗi tùy chọn được tối ưu cho những kịch bản khác nhau.
Mọi tối ưu hóa chúng tôi đã thảo luận đều phục vụ một mục tiêu: giúp computer vision trở nên dễ tiếp cận ở mọi nơi. Dù bạn đang xây dựng chuông cửa thông minh, ứng dụng drone hay một cloud service quy mô lớn, chúng tôi cung cấp các công cụ để YOLO hoạt động trong những giới hạn của bạn.
Khi bạn export một model YOLO bằng Ultralytics, bạn không chỉ lưu một file. Bạn đang tận dụng nhiều năm nghiên cứu về việc biến neural network thành công nghệ thực tiễn. Bạn đang chuyển một model AI hiện đại thành thứ có thể chạy trên phần cứng thực, với các giới hạn thực, để giải quyết những vấn đề thực.
Đó là những gì chúng tôi làm tại Ultralytics. Chúng tôi thu hẹp khoảng cách giữa nghiên cứu AI và triển khai thực tế. Chúng tôi giúp computer vision hoạt động ở mọi nơi, bởi tương lai của AI không chỉ là sở hữu những model tốt nhất – mà còn là làm cho các model đó trở nên hữu ích trong thế giới thực.









