Yolo Tầm nhìn Thâm Quyến
Thâm Quyến
Tham gia ngay

Làm thế nào tại Ultralytics chúng tôi sản xuất YOLO mô hình nhanh hơn trên chip yêu thích của bạn

Làm sao Ultralytics tối ưu hóa YOLO Chúng tôi sẽ trình bày các mô hình về tốc độ trên CPU, GPU và thiết bị biên. Chúng tôi sẽ giải thích về chip, bộ nhớ và các kỹ thuật thông minh như lượng tử hóa, hợp nhất và cắt tỉa.

Tại Ultralytics Chúng tôi tạo ra các mô hình 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 tưởng tượng những mô hình này như những công thức toán học khổng lồ. Chúng được tạo thành từ các phép toán (chúng tôi gọi chúng là các lớp) và một lượng lớn các con số mà chúng tôi gọi là trọng số.

Của chúng tôi Ultralytics YOLO Các mô hình xử lý hình ảnh như bản chất thực sự của chúng: mảng các con số! Mỗi pixel thực chất chỉ là các giá trị màu sắc, lượng màu Đỏ, Xanh lục và Xanh lam (do đó là RGB) cho mỗi điểm tạo nên hình ảnh. Chúng ta gọi những mảng số này là "tensor" vì nghe hay hơn nhiều so với "ma trận đa chiều", và "ma trận đa chiều" lại nghe hay hơn nhiều so với "các con số chồng chất lên nhau".

Khi bạn đưa một hình ảnh vào mô hình của chúng tôi, nó sẽ trải qua một hành trình dài trong mạng lưới. Hãy hình dung... tensor Lướt qua từng lớp, được biến đổi, làm rối tung và bị bóp méo về mặt toán học theo cách đẹp nhất có thể. Hãy tưởng tượng nó như một bữa tiệc khiêu vũ nơi các con số hòa quyện vào nhau, chắt lọc ra bản chất của những gì làm nên một con mèo hay một chiếc xe hơi. Chúng ta gọi quá trình này là trích xuất đặc trưng.

Kết quả cuối cùng là gì? Nhiều con số hơn! Những con số có ý nghĩa. Trong các tác vụ nhận dạng đối tượng, chúng cho bạn biết chính xác vị trí của các đối tượng trong hình ảnh và đối tượng đó có thể là gì. "Này, có 95% khả năng đó là một con chó tại tọa độ (x, y)!" Chúng ta gọi quá trình kỳ diệu này là suy luận.

Giờ đây, trước khi các mô hình của chúng ta có thể phát huy tác dụng, chúng cần phải được đào tạo. Và quá trình đào tạo là lúc mọi thứ trở nên căng thẳng nhất.

Trong quá trình huấn luyện, mỗi khi chúng ta đưa hình ảnh vào mạng, chúng ta không chỉ nhận được câu trả lời. Chúng ta đang thực hiện hai việc rất quan trọng. Đầu tiên, chúng ta tính toán mức độ sai sót của mạng (chúng ta gọi đó là hàm mất mát, về cơ bản là khoảng cách từ điểm chính xác). Thứ hai, và đây là phần quan trọng, chúng ta cập nhật mọi con số (hay trọng số) trong mạng dựa trên hàm mất mát đó. Hãy tưởng tượng như việc điều chỉnh hàng nghìn núm nhỏ cùng một lúc, trong đó mỗi điều chỉnh được tính toán để làm cho mạng chính xác hơn mỗi lần. Về cơ bản, chúng ta đang huấn luyện mạng thông qua việc sửa lỗi: mỗi sai lầm dạy cho nó biết điều gì KHÔNG nên làm, và chúng ta điều chỉnh tất cả các trọng số đó để khi nó nhìn thấy một hình ảnh tương tự một lần nữa, nó sẽ tiến gần hơn đến câu trả lời đúng. Về cơ bản, mạng học bằng cách được điều chỉnh đúng hướng, từng sai lầm một, cho đến khi nó bắt đầu dự đoán chính xác.

Chúng ta đang nói đến bao nhiêu tham số vậy? Chà, YOLO11n nhỏ nhắn dễ thương của chúng ta có vài triệu tham số. Nhưng YOLO11x thì sao? "Cây gậy" đó có tới hơn 50 triệu tham số! Nhiều tham số 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 việc vẽ bằng bút chì màu so với việc sử dụng đầy đủ bảng màu của một họa sĩ chuyên nghiệp.

Trong quá trình suy luận, số lượng tham số trở nên vô cùng quan trọng. Chạy một mạng nơ-ron 3 triệu tham số giống như chạy bộ quanh khu phố. Còn chạy một mạng nơ-ron 50 triệu tham số? Điều đó 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ì tính toán là gì? Quá trình xử lý số liệu phức tạp này diễn ra như thế nào? Làm thế nào để tăng tốc độ tính toán? Và "tối ưu hóa tính toán" nghĩa là gì?

Cách thức hoạt động thực tế của các phép toán trong chip

Quá trình tính toán diễn ra nhờ các con chip. Những khối silicon nhỏ bé này về cơ bản là những lâu đài cát được tổ chức chặt chẽ nhất trong vũ trụ. Mỗi thao tác mà 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 "nếu điều này thì điều kia", đều được khắc vật lý vào silicon. Có những mạch vật lý thực sự trong các khu vực cụ thể của chip dành riêng cho việc cộng các số, và các mạch khác dành cho các phép toán logic. Nó giống như một thành phố thu nhỏ, nơi các khu phố khác nhau chuyên về các loại toán học khác nhau.

Điều này nghe có vẻ kỳ lạ, ngay cả khi bạn là một nhà khoa học máy tính. Đó là bởi vì chúng ta đã dành 40 năm qua để xây dựng từng lớp trừu tượng, giống như một món lasagna công nghệ đã cao đến mức chúng ta thậm chí không còn nhìn thấy đáy nữa. Chúng ta đã đơn giản hóa mọi thứ đến mức hầu hết các lập trình viên ngày nay không biết quá trình tính toán thực sự diễn ra như thế nào trên chip silicon. Không phải lỗi của họ, mà là do thiết kế!

Hãy cùng bóc tách từng lớp này. Hãy xem ví dụ cực kỳ đơn giản này. Python mã số:

x = 1
if x == 1:
    y = x + 1

Chúng ta tạo một biến x, đặt giá trị của nó là 1, và nếu x bằng 1 (tiết lộ trước: nó bằng 1), chúng ta tạo biến y với giá trị bằng x cộng 1. Ba dòng. Dễ thôi.

Nhưng đây mới là điều thú vị. Giữa ba dòng kẻ tưởng chừng vô hại đó và những electron thực sự di chuyển trong silicon, có ÍT NHẤT bốn lớp chuyển đổi phức tạp đang diễn ra (thực tế còn nhiều hơn, nhưng người quản lý nội dung kỹ thuật số của chúng tôi nói rằng số lượng từ tôi viết ra đã khiến cô ấy lo lắng). Hãy để tôi dẫn bạn khám phá hành trình đầy kỳ thú này:

Lớp 1: Python → Mã bytecode trước, Python Nó đọc mã của bạn và biên dịch nó thành một thứ gọi là bytecode, một ngôn ngữ trung gian dễ hiểu hơn đối với máy tính nhưng sẽ khiến bạn đau mắt nếu cố gắng đọc nó.

Lớp 2: Mã bytecode → Mã máy Python Trình thông dịch (như CPython) nhận mã bytecode đó và dịch nó thành mã máy, tức là các lệnh thực tế mà bộ xử lý của bạn hiểu. Đây là lúc câu lệnh "if x == 1" thanh lịch của bạn trở thành một cái gì đó giống như "LOAD thanh ghi, COMPARE thanh ghi, JUMP nếu cờ 0 được đặt."

Lớp 3: Mã máy → Mã vi lệnh . Một bước ngoặt bất ngờ! Các bộ xử lý hiện đại thậm chí không thực thi trực tiếp mã máy. Chúng chia nhỏ mã máy hơn nữa thành mã vi lệnh, các thao tác nhỏ hơn nữa mà các thành phần bên trong chip có thể xử lý. Lệnh "CỘNG" đơn giản của bạn có thể trở thành nhiều thao tác vi lệnh.

Lớp 4: Mã vi lệnh → Điện tử vật lý Cuối cùng, chúng ta chạm đến silicon. Những thao tác vi lệnh này kích hoạt các tín hiệu điện thực tế truyền qua các bóng bán dẫn. Hàng tỷ công tắc nhỏ bật tắt, các electron di chuyển 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 lớp tồn tại để che giấu sự phức tạp đến điên rồ của lớp bên dưới nó. Nó giống như những con búp bê Nga xếp chồng lên nhau, chỉ khác là mỗi con búp bê nói một ngôn ngữ hoàn toàn khác nhau, và con búp bê nhỏ nhất đúng nghĩa đen được làm từ tia sét bị mắc kẹt trong cát.

Điều trớ trêu là gì? Chính ba dòng đó Python Có lẽ điều đó sẽ kích hoạt HÀNG TRIỆU công tắc transistor. Nhưng nhờ những khái niệm trừu tượng này, bạn không cần phải suy nghĩ về bất cứ điều gì trong số đó. Bạn chỉ cần viết "y = x + 1" và tin tưởng rằng ở đâu đó, sâu bên trong silicon, điều kỳ diệu sẽ xảy ra.

Kiến trúc

Mọi thao tác đều được thực hiện vật lý trên chip silicon, và VỊ TRÍ của nó trên chip hoàn toàn phụ thuộc vào cấu trúc của chip. Nó giống như quy hoạch đô thị, nhưng dành cho các electron. Bộ cộng nằm ở đây, bộ nhân nằm ở đó, và tất cả chúng cần giao tiếp với nhau một cách hiệu quả.

Trên thị trường hiện có hàng trăm loại chip khác nhau, mỗi loại được thiết kế cho các mục đích khác nhau. Vậy điểm khác biệt giữa chúng là gì? Đó là cấu trúc liên kết, cách thức bố trí và triển khai các thao tác trong miền vật lý. Đây chính là điều chúng ta gọi là kiến trúc, và quả thật, chúng ta có rất nhiều loại kiến trúc khác nhau:

  • x86 ( Intel và AMD) - Ông tổ của máy tính để bàn, phức tạp nhưng mạnh mẽ
  • ARM - Cung cấp sức mạnh cho điện thoại của bạn và ngày càng nhiều hơn cho máy tính xách tay, được thiết kế để hoạt động hiệu quả.
  • RISC-V - Kiến trúc sư mã nguồn mở nổi loạn, đang ngày càng được ưa chuộng ở khắp mọi nơi.
  • PowerPC - "quái vật" của IBM, vẫn đang được sử dụng trong các máy chơi game và máy chủ.
  • MIPS - Sự lựa chọn ưa thích của giới học thuật, đơn giản và thanh lịch
  • SPARC - Sản phẩm đóng góp của Sun Microsystems (nay là Oracle) cho điện toán hiệu năng cao
  • Kiến trúc GPU ( NVIDIA 'S CUDA (lõi, RDNA của AMD) - Những con quái vật xử lý song song

Mỗi kiến trúc không chỉ sắp xếp các bóng bán dẫn khác nhau mà còn sử dụng một ngôn ngữ khác nhau. Các khái niệm trừu tượng mà chúng ta sử dụng để gửi hướng dẫn đến các máy này hoàn toàn khác nhau. Giống như việc phải viết chỉ dẫn đường đi cho ai đó, nhưng tùy thuộc vào loại xe của họ, bạn có thể cần phải viết bằng tiếng Pháp, tiếng Quan thoại, hoặc thậm chí là ngôn ngữ biểu đạt.

Trái tim của Silicon

Nguồn năng lượng của chip là các electron, dòng điện chạy vào chip, cung cấp năng lượng cho quá trình tính toán. Nhưng chỉ năng lượng thôi là chưa đủ. Để một con chip thực sự hoạt động, để truyền dữ liệu qua cấu trúc phức tạp của nó, mọi thứ phụ thuộc vào một thành phần quan trọng: xung nhịp. Chính xung nhịp làm cho các electron di chuyển theo 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ó những khối silicon được cấp điện mà không làm gì cả.

Hãy tưởng tượng việc điều phối một màn trình diễn quy mô lớn, nơi hàng tỷ linh kiện cần hoạt động đồng bộ hoàn hảo. Nếu thiếu nhịp điệu, mọi thứ sẽ trở nên hỗn loạn. Đó chính xác là chức năng của xung nhịp đối với bộ xử lý của bạn. Nó là một tinh thể rung động với tần số cực kỳ ổn định, phát ra các xung điện hàng tỷ lần mỗi giây.

Khi bạn nghe thấy "bộ xử lý 3,5 GHz", thì GHz (gigahertz) là tốc độ xung nhịp, 3,5 tỷ nhịp mỗi giây. Mỗi nhịp được gọi là một chu kỳ xung nhịp, và đó 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 chu kỳ xung nhịp. Toàn bộ máy tính bị đóng băng, chờ nhịp tiếp theo. Nó giống như trò chơi đèn đỏ, đèn xanh khắc nghiệt nhất trong vũ trụ. Mỗi khi có "đèn xanh" (xung nhịp):

  • Dữ liệu 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 dựa trên logic được đưa ra.
  • Bộ nhớ được đọc hoặc ghi.

Một số thao tác chỉ mất một chu kỳ (phép cộng đơn giản), trong khi những thao tác khác mất nhiều chu kỳ (phép chia hoặc truy xuất dữ liệu từ RAM). Quá trình này được lập trình chính xác, hàng tỷ thành phần thực hiện các thao tác cụ thể của chúng, tất cả đều được đồng bộ hóa theo nhịp điệu không ngừng nghỉ này. 

Bạn có thể ép xung bộ xử lý bằng cách làm cho tinh thể rung nhanh hơn; mọi thứ diễn ra nhanh hơn, nhưng điều này cũng tạo ra nhiều nhiệt hơn, khiến máy tính trở nên kém ổn định hơn. Nếu ép xung quá mức, máy tính của bạn sẽ bị treo vì các electron không thể theo kịp nhịp rung.

Ngày xưa, những thao tác này được thực hiện bằng những cỗ máy to bằng cả căn phòng. Nhưng các bộ phận thực hiện tất cả các phép tính này lại vô cùng đơn giản: chúng chỉ là những công tắc. Công tắc bật hoặc tắt.

Nối đủ các công tắc này lại với nhau theo đúng kiểu, và bạn sẽ có được khả năng tính toán. Toàn bộ cuộc cách mạng kỹ thuật số đều dựa trên một hệ thống công tắc phức tạp.

Sự đơn giản này có nghĩa là nếu bạn có bất kỳ công tắc nào, bạn đều có thể tạo ra một chiếc máy tính. Người ta đã chế tạo những chiếc máy tính hoạt động được từ ống nước và van, quân cờ domino, khối LEGO, viên bi, và thậm chí cả bằng redstone trong Minecraft.

Các nguyên tắc cơ bản không thay đổi kể từ những năm 1940. Chúng ta chỉ trở nên cực kỳ giỏi trong việc chế tạo các công tắc siêu nhỏ. Điện thoại của bạn có sức mạnh tính toán lớn hơn tất cả các máy tính đã đưa con người lên mặt trăng, và nó nằm gọn trong túi bạn vì chúng ta đã tìm ra cách chế tạo các công tắc ở cấp độ nguyên tử.

Khi vận hành các mạng nơ-ron với hàng triệu tham số, chúng ta đang bật tắt những công tắc nhỏ này hàng tỷ lần mỗi giây, tất cả đều được đồng bộ hóa hoàn hảo với nhịp đập chính xác của hệ thống. Mỗi lần cập nhật trọng số, mỗi phép nhân ma trận, mỗi hàm kích hoạt, tất cả đều tuân theo nhịp điệu của đồng hồ.

Chẳng trách việc huấn luyện mô hình khiến máy tính của bạn phát ra âm thanh như thể đang cố gắng cất cánh!

Khiến mạng nơ-ron hoạt động mạnh mẽ!

Được rồi, vậy là chúng ta có những con chip với hàng tỷ công tắc hoạt động theo nhịp điệu của tinh thể, và chúng ta muốn chạy các mạng nơ-ron với hàng triệu tham số trên đó. Nghe có vẻ dễ dàng, phải không? Chỉ cần đưa các con số vào chip và để nó hoạt động thôi!

Việc chạy mạng nơ-ron nhanh giống như cố gắng nấu một bữa ăn năm món trong một căn bếp mà tủ lạnh cách đó ba dãy nhà, bạn chỉ có một cái chảo và mỗi nguyên liệu nặng tới 227 kg. Bản thân phép toán không phải là vấn đề lớn nhất; mà là tất cả những thứ khác.

Sự không phù hợp về kiến trúc

Hầu hết các chip được thiết kế để chạy Microsoft Lời nói, không phải mạng lưới thần kinh. Của bạn CPU 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, vòng lặp, và thỉnh thoảng tính toán thuế của bạn (một phép tính mà ngay cả siêu máy tính cũng thấy mệt mỏi về mặt cảm xúc). Nó được tối ưu hóa cho các hoạt động tuần tự: làm việc này, rồi việc kia, rồi việc khác nữa.

Nhưng mạng nơ-ron thì hoàn toàn khác. Chúng muốn làm MỌI THỨ CÙNG MỘT LÚC. Trong quá trình huấn luyện, bạn cập nhật hàng triệu trọng số dựa trên độ sai lệch của dự đoán. Trong quá trình suy luận (thực sự sử dụng mô hình đã được huấn luyện), bạn xử lý dữ liệu thông 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 Thật đáng quý, nó muốn làm từng việc một, giống như một kế toán làm việc rất nhanh nhưng rất bài bản.

Đây là lý do tại sao GPU trở thành xương sống của điện toán AI. GPU được thiết kế cho trò chơi điện tử, nơi bạn cần tính toán màu sắc của hàng triệu pixel cùng một lúc. Hóa ra, việc tính toán màu sắc pixel và thực hiện các phép toán mạng nơ-ron lại khá giống nhau: cả hai đều liên quan đến việc thực hiện cùng một thao tác trên lượng dữ liệu khổng lồ song song.

Nhưng ngay cả GPU cũng không hoàn hảo cho mạng nơ-ron. Đó là lý do tại sao các công ty hiện đang chế tạo các chip AI chuyên dụng (TPU, NPU và tất cả các từ viết tắt khác kết thúc bằng PU). Những con chip này được thiết kế từ đầu với một nhiệm vụ duy nhất: làm cho mạng nơ-ron hoạt động nhanh. Chúng giống như việc thuê một đầu bếp chỉ biết nấu một món ăn, nhưng họ nấu nó với tốc độ siêu phàm. Trong khi... CPU gặp khó khăn khi thực hiện các phép toán ma trận theo trình tự và bạn GPU Chúng xử lý chúng khá tốt song song, những con chip chuyên dụng này "ăn" ma trận cả ngày lẫn đêm.

Bức tường ký ức (Hay: Tại sao việc di chuyển dữ liệu lại khó hơn cả toán học)

Trong tính toán mạng nơ-ron hiện đại, chúng ta dành nhiều thời gian và năng lượng hơn cho việc DI CHUYỂN dữ liệu so với việc THỰC SỰ TÍNH TOÁN với dữ liệu đó.

Hãy tưởng tượng con chip máy tính của bạn giống như một nhà toán học xuất chúng làm việc với tốc độ cực nhanh, nhưng tất cả sách tham khảo của họ lại được cất giữ ở những tòa nhà khác nhau trong 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, họ cần phải có được các con số, và hành trình đó mất rất nhiều thời gian.

Con chip của bạn có thể nhân hai số trong một chu kỳ xung nhịp (hãy nhớ, đó là một trong hàng tỷ xung nhịp mỗi giây). Nhanh như chớp! Nhưng việc lấy những con số đó từ bộ nhớ vào chip thì sao? Có thể mất HÀNG TRĂM chu kỳ. Giống như nhà toán học của bạn có thể giải một bài toán trong một giây, nhưng lại cần năm phút để đi bộ đến thư viện và quay về.

Lý do là khoảng cách (và không gian). Dòng điện di chuyển nhanh, nhưng không phải nhanh vô hạn. Dữ liệu càng phải di chuyển xa trên chip, thời gian càng lâu. Các nhà thiết kế máy tính đã giải quyết vấn đề này bằng cách tạo ra một hệ thống phân cấp bộ nhớ, giống như có nhiều vị trí lưu trữ ở các khoảng cách khác nhau:

  • Các thanh ghi (được tích hợp trực tiếp vào các đơn vị tính toán): 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ể lưu trữ khoảng 32 con số ở đây. Giống như có những mẩu giấy ghi chú ngay trước mặt bạn vậy.
  • Bộ nhớ cache L1 (cách vài micromet): Giá sách trong văn phòng. Mất 3-4 chu kỳ để lấy một thứ gì đó. Ở đây, bạn có thể lưu trữ vài nghìn con số.
  • Bộ nhớ cache L2 (cách vài milimét): Giống như tủ đựng hồ sơ ở cuối hành lang. Mất 10-15 chu kỳ và có thể chứa vài triệu số.
  • Bộ nhớ đệm L3 (nằm trên toàn bộ chip): Là phòng lưu trữ ở tầng dưới. Mất 30-50 chu kỳ, lưu trữ hàng chục triệu số.
  • RAM (trên một con chip hoàn toàn khác): Kho hàng ở phía bên kia thành phố. Nó cần 100-300 chu kỳ. Đây là nơi lưu trữ hàng tỷ con số của bạn.
  • Ổ cứng SSD/HDD (kết nối bằng cáp): Một thế giới hoàn toàn khác. Cần hàng triệu chu kỳ xử lý. Dung lượng lưu trữ khổng lồ, tốc độ cực chậm.

Cấu trúc cụ thể có thể khác nhau, chip điện thoại của bạn có thể bỏ qua bộ nhớ đệm L3, trong khi máy chủ thì không. CPU Nó có thể chứa một lượng lớn dữ liệu. Tuy nhiên, nguyên tắc vẫn giữ nguyên: bộ nhớ càng gần thì tốc độ càng nhanh nhưng dung lượng càng nhỏ.

Và đây là lúc mạng nơ-ron trở nên khó khăn. Hãy tưởng tượng... Ultralytics YOLO mô hình có 50 triệu tham số ( ChatGPT (Nhân tiện, nó có hàng tỷ). Đó là 50 triệu con số cần di chuyển từ bộ nhớ đến các đơn vị tính toán và ngược lại. Ngay cả khi mỗi con số chỉ có 4 byte, thì đó cũng là 200 megabyte dữ liệu cần di chuyển qua hệ thống của bạn.

Con chip có thể xử lý mỗi con số trong một chu kỳ, nhưng nếu mất 100 chu kỳ để lấy con số đó từ RAM, bạn sẽ dành 99% thời gian để chờ đợi dữ liệu được gửi đến. Điều này giống như một chiếc xe đua Công thức 1 bị kẹt xe. Toàn bộ sức mạnh tính toán đó đang nằm đó, chờ đợi dữ liệu đến.

Đây là điểm mấu 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. Việc làm cho chip xử lý toán học nhanh hơn tương đối dễ dàng. Việc làm cho bộ nhớ nhanh hơn đang gặp phải giới hạn vật lý. Đó là lý do tại sao hầu hết mọi tối ưu hóa hiệu năng trong AI đều diễn ra ở cấp độ bộ nhớ. Khi các kỹ sư tăng tốc mạng nơ-ron, họ hiếm khi làm cho phép toán nhanh hơn; họ đang tìm những cách thông minh để di chuyển dữ liệu ít hơn, lưu vào bộ nhớ đệm tốt hơn hoặc truy cập dữ liệu thông minh hơn.

Các chip AI hiện đại không chỉ tập trung vào tốc độ tính toán; chúng còn chú trọng đến băng thông bộ nhớ và các chiến lược di chuyển dữ liệu. Chúng tải trước dữ liệu, tái sử dụng các giá trị đã có trong bộ nhớ cache và sắp xếp các phép tính để giảm thiểu số lần truy cập bộ nhớ. Người chiến thắng trong cuộc đua phần cứng AI không phải là người có máy tính nhanh nhất; mà là người tìm ra cách để cung cấp đủ dữ liệu cho các máy tính đó. Toàn bộ cuộc chơi xoay quanh việc tối ưu hóa các mô hình truy cập bộ nhớ. 

Mỗi lần bạn di chuyển một chút dữ liệu, bạn đều tiêu hao năng lượng. Không nhiều, chỉ là picojoule, nhưng khi bạn di chuyển terabyte mỗi giây, lượng năng lượng tiêu hao sẽ tăng lên rất nhanh. Trên thực tế, việc di chuyển dữ liệu 1mm trên một con chip tiêu tốn nhiều năng lượng hơn cả việc thực hiện phép tính!

Đây là lý do tại sao máy tính xách tay của bạn phát ra tiếng ồn như động cơ phản lực khi huấn luyện mạng nơ-ron. Không phải các phép toán tạo ra nhiệt; mà là sự di chuyển của dữ liệu. Mỗi lần cập nhật tham số, mỗi phép tính gradient, mỗi lần truyền dữ liệu đều thực sự làm nóng căn phòng của bạn.

Các bộ tăng tốc AI 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 phép tính trước khi chip bị nóng chảy? Chúng ta có thể tản nhiệt nhanh đến mức nào? Nó giống như ép xung, nhưng xung nhịp luôn ở mức tối đa, và chúng ta chỉ đang cố gắng tránh gây ra hỏa hoạn.

Giải pháp? Thiết kế chú trọng đến kiến trúc.

Các mạng nơ-ron nhanh nhất không nhất thiết là thông minh nhất, mà là những mạng được thiết kế dành riêng cho chip. Chúng:

  • Càng giữ dữ liệu cục bộ càng tốt.
  • Tái sử dụng các phép tính một cách ám ảnh
  • Hoàn toàn phù hợp với khả năng phần cứng
  • Giảm thiểu tối đa việc di chuyển bộ nhớ bằng mọi giá.

Nó giống như sự khác biệt giữa một công thức nấu ăn ghi "sử dụng nguyên liệu từ cửa hàng tạp hóa địa phương" với một công thức yêu cầu bạn nhập khẩu gia vị từ Tây Tạng, pho mát từ Pháp và nước từ Nam Cực. Cả hai đều có thể ngon, nhưng một cái chắc chắn thiết thực hơn.

Và đó là lý do tại sao việc làm cho mạng nơ-ron hoạt động nhanh là một nghệ thuật. Chỉ giỏi toán thôi chưa đủ; bạn cần hiểu phần cứng, tôn trọng thứ tự ưu tiên bộ nhớ và phối hợp hoàn hảo với kiến trúc hệ thống.

Chào mừng đến với thế giới nơi khoa học máy tính giao thoa với vật lý, kỹ thuật và cả phép thuật thuần túy. Nơi việc 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 đồng bộ hóa lại là cái chết. Nơi kẻ thù lớn nhất của bạn không phải là sự phức tạp, mà là khoảng cách.

Cách chúng tôi sản xuất YOLO nhanh hơn

Khi bạn huấn luyện một YOLO Với mô hình đó, bạn sẽ có một mạng nơ-ron hoạt động tuyệt vời trên thiết lập huấn luyện của mình. Nhưng vấn đề là: trò chơi của bạn... GPU Máy tính của bạn, chiếc iPhone, và con chip nhỏ xíu trong camera an ninh đều nói những ngôn ngữ hoàn toàn khác nhau. Chúng có những điểm mạnh, điểm yếu khác nhau và những ý tưởng rất khác nhau về cách xử lý dữ liệu.

Hãy nghĩ theo cách này: một GPU Nó có hàng ngàn lõi có thể hoạt động đồng thời – nó được xây dựng để xử lý song song. Trong khi đó, một chip di động có thể có các mạch đặc biệt được thiết kế riêng cho các hoạt động AI, nhưng chỉ có thể xử lý một số loại toán nhất định. Và thiết bị biên trong camera chuông cửa nhà bạn? Nó đang cố gắng chạy AI với mức tiêu thụ năng lượng nhỏ hơn cả một bóng đèn LED.

Tại Ultralytics Chúng tôi hỗ trợ hơn chục định dạng xuất khác nhau vì mỗi định dạng được tối ưu hóa cho từng phần cứng khác nhau. Vấn đề không phải là có quá nhiều tùy chọn, mà là có tùy chọn phù hợp với nhu cầu cụ thể của BẠN.

Kết hợp các thao tác: Làm được nhiều hơn với ít nguồn lực hơn

Trong bản gốc YOLO Trong mô hình này, nhiều thao tác diễn ra theo trình tự. Ví dụ, chúng ta có thể thực hiện phép tích chập, sau đó chuẩn hóa kết quả, rồi áp dụng hàm kích hoạt. Đó là ba bước riêng biệt, mỗi bước đều yêu cầu thao tác đọc và ghi bộ nhớ riêng.

Nhưng đây mới là điểm hay: chúng ta có thể kết hợp các thao tác này thành một bước duy nhất. Khi chúng ta xuất khẩu YOLO Để triển khai, chúng tôi kết hợp các thao tác này lại với nhau. Thay vì:

  1. Tính toán phép chập → Lưu vào bộ nhớ
  2. Tải từ bộ nhớ → Chuẩn hóa → Lưu vào bộ nhớ
  3. Tải từ bộ nhớ → Áp dụng kích hoạt → Lưu vào bộ nhớ

Chúng tôi làm điều đó:

  1. Tính toán phép tích chập + chuẩn hóa + kích hoạt → Lưu vào bộ nhớ

Đối với một trường hợp điển hình YOLO Với mô hình xử lý hình ảnh 640×640, thủ thuật đơn giản này giúp loại bỏ hàng gigabyte dữ liệu truyền tải không cần thiết. Trên điện thoại di động, đó chính là sự khác biệt giữa khả năng nhận diện mượt mà theo thời gian thực và hiện tượng giật lag khó chịu.

Sử dụng các số nhỏ hơn: Phép màu lượng tử hóa

YOLO Thực ra không cần những con số siêu chính xác để detect các đối tượng được biểu diễn chính xác. Trong quá trình huấn luyện, chúng tôi sử dụng 32 bit để biểu diễn mỗi trọng lượng – điều đó giống như sử dụng máy tính khoa học để đo lường các nguyên liệu làm bánh sandwich. Còn đối với việc triển khai thực tế? 8 bit hoạt động hoàn hảo.

Đây được gọi là lượng tử hóa, và nó là một trong những kỹ thuật tối ưu hóa mạnh mẽ nhất của chúng ta. Bằng cách sử dụng các số nhỏ hơn:

  • Kích thước mô hình giảm 75% (từ 200MB xuống còn 50MB đối với Ultrakytics YOLO11x)
  • Nó chạy nhanh hơn từ 2 đến 4 lần trên hầu hết các thiết bị.
  • Nó tiêu thụ ít năng lượng hơn nhiều (pin điện thoại của bạn sẽ cảm ơn bạn đấy).

Không phải tất cả các lớp đều ở YOLO đều nhạy cảm như nhau với sự suy giảm này. Các lớp đầu tiên mà detect Các cạnh và hình dạng cơ bản? Chúng rất mạnh mẽ – chúng ta có thể sử dụng số 8 bit mà không gặp vấn đề gì. Các lớp phát hiện cuối cùng để xác đị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 ta điều chỉnh độ chính xác từng lớp một, sử dụng đủ bit để duy trì độ chính xác trong khi tối đa hóa tốc độ.

Chúng tôi nhận thấy rằng với quá trình lượng tử hóa cẩn thận, Ultralytics YOLO Nó duy trì 99,5% độ chính xác ban đầu trong khi chạy nhanh hơn gấp 3 lần trên điện thoại. Đó là sự khác biệt giữa một mô hình nghiên cứu và một thứ bạn thực sự có thể sử dụng trong thế giới thực.

Lựa chọn thuật toán tốt nhất

Có hàng tá cách khác nhau để thực hiện cùng một phép toán. Phép tích chập đơn giản (phép toán cốt lõi trong...) YOLO (Có thể tính toán bằng các thuật toán 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 và kích thước đầu vào cụ thể của bạn.)

Khi chúng tôi xuất khẩu YOLO Khung tối ưu hóa của chúng tôi thực sự kiểm tra các thuật toán khác nhau và chọn thuật toán nhanh nhất cho trường hợp cụ thể của bạn. Nó giống như việc có nhiều tuyến đường đến cùng một điểm đến và lựa chọn dựa trên điều kiện giao thông hiện tại. Trên một GPU Chúng ta có thể sử dụng thuật toán xử lý nhiều điểm ảnh cùng lúc. Trên một CPU Chúng ta có thể sử dụng một thuật toán được tối ưu hóa cho xử lý tuần tự. Công thức toán học thì giống nhau, nhưng chiến lược thực thi hoàn toàn khác.

Bộ nhớ: Nút thắt cổ chai tiềm ẩn

Bạn còn nhớ chúng ta đã từng thảo luận về việc bộ nhớ chính 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 Mô hình có thể có tới 50 triệu tham số, và trong quá trình suy luận, nó tạo ra hàng gigabyte kết quả trung gian. Việc di chuyển tất cả dữ liệu này thường chậm hơn cả quá trình tính toán thực tế.

Chúng tôi sử dụng một số thủ thuật để giảm thiểu việc di chuyển bộ nhớ:

Lập lịch thông minh : Chúng tôi sắp xếp các thao tác sao cho dữ liệu được sử dụng ngay lập tức trong khi vẫn còn nằm trong bộ nhớ cache tốc độ cao. Ví dụ: YOLO Với tính năng mạng lưới hình kim tự tháp, điều này giúp giảm lưu lượng truy cập bộ nhớ xuống 40%.

Phân mảnh hình ảnh : Thay vì xử lý toàn bộ hình ảnh cùng một lúc, chúng ta chia nó thành các mảnh nhỏ hơn phù hợp với bộ nhớ cache. Điều này có nghĩa là bộ xử lý có thể làm việc với bộ nhớ cục bộ tốc độ cao thay vì liên tục truy xuất từ bộ nhớ chính chậm chạp.

Tái sử dụng bộ đệm : Thay vì liên tục tạo bộ nhớ mới cho các kết quả trung gian, chúng ta tái sử dụng cùng một bộ đệm bộ nhớ. Điều này cực kỳ hiệu quả – YOLO Toàn bộ hệ thống xương sống của nó có thể hoạt động chỉ với một loạt các bộ đệm có thể tái sử dụng.

Cắt tỉa cành: Càng ít càng tốt

Đây là một sự thật đáng ngạc nhiên: YOLO Các mô hình thường được thiết kế quá phức tạp. Chúng ta có thể loại bỏ 30% kênh trong nhiều lớp mà hầu như không ảnh hưởng đến độ chính xác. Điều này không chỉ làm cho mô hình nhỏ hơn mà còn làm cho nó nhanh hơn, vì thực tế là số lượng phép tính cần thực hiện đã ít hơ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 mạng đóng góp ít nhất vào kết quả phát hiện cuối cùng, loại bỏ chúng, và sau đó tinh chỉnh mô hình để bù đắp. Một mô hình YOLO11m đã được tinh chỉnh 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, sự cải thiện hiệu quả này có thể đồng nghĩa với việc tăng thêm hàng giờ hoạt động.

Tăng tốc phần cứng: Khai thác tối đa thế mạnh của từng chip

Mỗi bộ vi xử lý có những ưu điểm riêng, và sự khác biệt về hiệu năng là rất lớn. Cùng một mẫu YOLO11n thì cần:

  • 45 mili giây mỗi khung hình trên một thiết bị hiện đại Intel CPU
  • 4 mili giây trên một NVIDIA RTX GPU
  • 22 mili giây trên bộ xử lý điện thoại cao cấp
  • 15 mili giây trên một Google Viền san hô TPU

Đây không chỉ là sự khác biệt về tốc độ từ xung nhịp – chúng phản ánh những khác biệt kiến trúc cơ bản. GPU có hàng nghìn lõi hoạt động song song, rất phù hợp cho việc này. YOLO Các phép tích chập của nó. NPU di động có các mạch chuyên dụng được thiết kế riêng cho mạng nơ-ron. CPU là "đa năng", linh hoạt nhưng không chuyên dụng.

Mấu chốt của việc tối ưu hóa là sự phù hợp YOLO Các hoạt động của 's phù hợp với chức năng tốt nhất của từng chip. A GPU Nó thích thực hiện cùng một thao tác trên nhiều dữ liệu cùng lúc. Một NPU di động có thể chỉ hỗ trợ một số thao tác nhất định nhưng lại thực hiện chúng cực kỳ hiệu quả. Một thiết bị biên TPU Chỉ hoạt động với số nguyên 8 bit nhưng đạt được tốc độ đáng kể trong giới hạn đó.

Phép thuật biên soạn

Khi bạn xuất một YOLO Điều đáng chú ý xảy ra đằng sau hậu trường khi chúng tôi biên dịch mô hình. Chúng tôi không chỉ chuyển đổi định dạng tệp – chúng tôi thực sự biên dịch mô hình dành riêng cho phần cứng mục tiêu của bạn. Điều này giống như sự khác biệt giữa... Google Dịch bởi người bản ngữ. Quy trình biên soạn:

  1. Phân tích mô hình của bạn để hiểu cấu trúc và các yêu cầu của nó.
  2. Hãy xem xét khả năng của phần cứng – nó làm tốt ở điểm nào, và gặp khó khăn ở điểm nào.
  3. Tạo ra mã được tối ưu hóa , sử dụng ngôn ngữ gốc của phần cứng.

Trình biên dịch có thể sắp xếp lại các thao tác để sử dụng bộ nhớ cache của bộ xử lý hiệu quả hơn, chọn các lệnh chuyên dụng mà chip của bạn hỗ trợ, hoặc thậm chí sử dụng máy học để tìm ra chiến lược tối ưu hóa tốt nhất. Đúng vậy, chúng ta đang sử dụng AI để tối ưu hóa AI – tương lai đã đến rồi!

Bước biên dịch này có thể tạo ra sự khác biệt gấp 10 lần về hiệu năng. Điều tương tự cũng xảy ra. YOLO Mô hình có thể hoạt động chậm chạp với mã nguồn chung chung nhưng sẽ hoạt động trơn tru với các hướng dẫn được tối ưu hóa đúng cách.

Triển khai thực tế tại biên

Chúng ta hãy cùng thảo luận về những gì sẽ xảy ra khi YOLO Gặp gỡ thế giới thực – cụ thể là thế giới đầy thách thức của các thiết bị biên. Hãy tưởng tượng một camera an ninh cần phải hoạt động. YOLO Hoạt động 24/7 để phát hiện đối tượng. Nó phải đối mặt với những hạn chế khắc nghiệt:

  • Bộ nhớ : Có thể chỉ từ 512MB đến 2GB RAM tổng cộng.
  • Công suất : Thường chỉ từ 2-5 watt (ít hơn cả bộ sạc điện thoại)
  • Làm mát : Không có quạt, chỉ dựa vào tản nhiệt thụ động.
  • Độ tin cậy : Phải hoạt động liên tục mà không bị lỗi.

Đây là những gì mà việc tối ưu hóa mang lại trong thực tế. Một camera an ninh đang chạy YOLO11s:

  • Mẫu gốc: 15 watt, hoạt động ở nhiệt độ cao 85°C, đạt tốc độ 20 FPS
  • Được tối ưu hóa bằng lượng tử hóa và cắt tỉa: công suất 3 watt, nhiệt độ thoải mái 45°C, đạt 25 khung hình/giây

Chúng tôi đã giảm mức tiêu thụ điện năng đến 80% trong khi vẫn cải thiện hiệu năng! Đó chính là sự khác biệt giữa một thiết bị quá nóng và hao pin so với một thiết bị hoạt động ổn định trong nhiều năm.

Điều mấu chốt là phải lựa chọn những sự đánh đổi phù hợp. Trên các thiết bị biên, chúng ta thường:

  • Sử dụng lượng tử hóa INT8 (độ chính xác thấp hơn, công suất thấp hơn nhiều)
  • Xử lý ít khung hình hơn khi hoạt động thấp.
  • Phân bổ công việc cho các bộ xử lý khác nhau để quản lý nhiệt.
  • Giữ cho các mô hình đủ nhỏ để nằm gọn trong bộ nhớ tốc độ cao.

Quá trình tối ưu hóa

Tại Ultralytics Chúng tôi tuân theo một phương pháp tối ưu hóa có hệ thống. Đầu tiên, chúng tôi phân tích mô hình để hiểu thời gian thực sự được dành cho việc gì. Thông thường, các điểm nghẽn không nằm ở nơi bạn mong đợi. Có thể 80% thời gian được dành cho chỉ một vài lớp, hoặc việc truyền dữ liệu bộ nhớ chiếm ưu thế trong thời gian tính toán.

Tiếp theo, chúng ta áp dụng các biện pháp tối ưu hóa một cách lặp đi lặp lại:

  1. Hãy bắt đầu với những điểm nghẽn lớn nhất.
  2. Áp dụng từng biện pháp tối ưu hóa một.
  3. Đo lường cả sự cải thiện về tốc độ và tác động đến độ chính xác.
  4. Hãy giữ lại những phương án tối ưu hóa mang lại sự cân bằng tốt.
  5. Lặp lại cho đến khi đạt được mục tiêu.

Ví dụ, với việc triển khai YOLO11m trên điện thoại:

  • Cấu hình cơ bản: 200ms mỗi khung hình, mô hình 200MB
  • Sau khi lượng tử hóa: 80ms mỗi khung hình, mô hình 50MB
  • Sau khi cắt tỉa: 60ms mỗi khung hình, mô hình 35MB
  • Sau khi hợp nhất thao tác: 45ms mỗi khung hình, mô hình 35MB

Mỗi bước đều cải thiện hiệu suất trong khi vẫn duy trì độ chính xác trên 99% so với ban đầu. Kết quả? Phát hiện vật thể theo thời gian thực trên một thiết bị nhỏ gọn nằm trong túi bạn.

Tương lai: Điện toán dị cấu

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 bộ xử lý cùng nhau. Điện thoại của bạn không chỉ có một bộ xử lý – mà có nhiều bộ xử lý, mỗi bộ chuyên dụng cho các tác vụ khác nhau:

  • Cảm biến máy ảnh có bộ xử lý tín hiệu hình ảnh (ISP) để xử lý sơ bộ hình ảnh.
  • Bộ xử lý thần kinh (NPU) hoạt động YOLO suy luận
  • Cái CPU xử lý logic và phối hợp phức tạp
  • Cái GPU hiển thị kết quả trên màn hình

Tương lai của YOLO Tối ưu hóa là việc phân chia mô hình một cách thông minh giữa các bộ xử lý này. Có thể NPU xử lý các phép tích chập chính, còn bộ xử lý khác thì không. CPU thực hiện logic phát hiện cuối cùng và GPU Nó trực quan hóa kết quả. Mỗi bộ xử lý thực hiện nhiệm vụ sở trường của mình, tạo ra một quy trình xử lý hiệu quả hơn bất kỳ bộ xử lý đơn lẻ nào có thể đạt được.

Chúng tôi đang phát triển các thuật toán phân vùng thông minh tự động tìm ra cách chia tách tối ưu nhất. YOLO Trên tất cả các bộ xử lý hiện có, cần xem xét không chỉ khả năng của chúng mà còn cả chi phí truyền dữ liệu giữa chúng.

Kết luận

Tối ưu hóa YOLO Việc xây dựng mô hình không chỉ đơn thuần là chuyển đổi định dạng tệp; mà còn là biến trí tuệ nhân tạo tiên tiến thành thứ thực sự hoạt động hiệu quả 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), cắt tỉa (loại bỏ các phần không cần thiết), hợp nhất các bước (kết hợp các bước) và quản lý bộ nhớ thông minh, chúng tôi đạt được hiệu suất cải thiện từ 10 đến 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" nào cho tất cả mọi trường hợp. Một máy chủ đám mây với sức mạnh không giới hạn cần các phương pháp tối ưu hóa khác với một máy bay không người lái chạy bằng pin. Một chiếc điện thoại có chip AI chuyên dụng cần được xử lý khác với một chiếc Raspberry Pi. Đó là lý do tại sao Ultralytics Cung cấp rất nhiều tùy chọn xuất khẩu – mỗi tùy chọn được tối ưu hóa cho các trường hợp khác nhau.

Mọi sự tối ưu hóa mà chúng ta đã thảo luận đều phục vụ một mục tiêu: làm cho thị giác máy tính trở nên dễ tiếp cận ở mọi nơi. Cho dù bạn đang xây dựng một chiếc chuông cửa thông minh, một ứng dụng cho máy bay không người lái hay một dịch vụ đám mây quy mô lớn, chúng tôi đều cung cấp các công cụ để thực hiện điều đó. YOLO Hãy làm việc trong phạm vi khả năng của bạn.

Khi bạn xuất một YOLO mô hình với Ultralytics Bạn không chỉ đơn thuần lưu một tập tin. Bạn đang tận dụng nhiều năm nghiên cứu để biến mạng nơ-ron trở nên thiết thực. Bạn đang chuyển đổi một mô hình AI tiên tiến thành một thứ có thể chạy trên phần cứng thực, với những ràng buộc thực tế, giải quyết các vấn đề thực tế.

Đó 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à ứng dụng thực tiễn. Chúng tôi giúp thị giác máy tính hoạt động ở mọi nơi, bởi vì tương lai của AI không chỉ nằm ở việc sở hữu những mô hình tốt nhất – mà còn là việc biến những mô hình đó trở nên hữu ích trong thế giới thực.

Hãy cùng nhau xây dựng tương lai
của AI!

Bắt đầu hành trình của bạn với tương lai của học máy

Bắt đầu miễn phí