Bên trong cuda-convnet: Các lớp AlexNet trên hai GPU và kỷ nguyên ImageNet

Cột mốc AlexNet năm 2012 dựa vào kỹ thuật GPU cấp thấp (cuda-convnet), kiến trúc phân chia trên hai GPU, và trực tiếp châm ngòi cho cuộc đua nhanh chóng hướng tới các mô hình thị giác máy tính sâu hơn, hiệu quả hơn.
1. Cách cuda-convnet hoạt động bên trong
Trước khi NVIDIA tạo ra cuDNN, Alex Krizhevsky đã viết cuda-convnet bằng CUDA C++ thuần để khai thác tốc độ tối đa từ các GPU kiến trúc Fermi đời đầu (GTX 580). Các thư viện hiện đại thường biến đổi các phép tích chập thành những phép nhân ma trận khổng lồ (im2col), tiêu tốn lượng bộ nhớ rất lớn. Vì mỗi GTX 580 chỉ có 3 GB VRAM, Krizhevsky đã thiết kế các thủ tục GPU trực tiếp, tiết kiệm bộ nhớ.
- Bố trí bộ nhớ ưu tiên lô (CHWN). Các framework hiện đại mặc định dùng NCHW (lô, kênh, chiều cao, chiều rộng), đặt tất cả các điểm ảnh của một ảnh cạnh nhau trong bộ nhớ. Krizhevsky lưu tensor theo thứ tự CHWN, đặt chiều lô (N) ở cuối. Khi 32 luồng GPU trong một warp xử lý 32 ảnh khác nhau tại đúng cùng một vị trí điểm ảnh, các lần đọc bộ nhớ của chúng hoàn toàn liền kề nhau (được gộp), giúp tối đa hóa băng thông VRAM.
- Chia ô bộ nhớ dùng chung. Đọc từ VRAM toàn cục mất hàng trăm chu kỳ xung nhịp, trong khi bộ nhớ dùng chung trên chip (chỉ 48 KB trên mỗi Streaming Multiprocessor của GTX 580) chỉ mất vài chu kỳ. Các khối luồng nạp những mảnh 2D nhỏ gồm các điểm ảnh và trọng số bộ lọc vào bộ nhớ dùng chung, tính hàng chục tích vô hướng trước khi ghi kết quả cuối cùng trở lại VRAM.
- Tái sử dụng thanh ghi ở cấp warp. Krizhevsky giao cho mỗi khối luồng tính một ô điểm ảnh đầu ra trên nhiều bộ lọc cùng lúc. Nhờ giữ trọng số bộ lọc trong các thanh ghi GPU nhanh, một mảnh ảnh duy nhất được nạp từ bộ nhớ dùng chung có thể được tái sử dụng đồng thời trên nhiều bộ lọc, giảm mạnh lưu lượng truy cập bộ nhớ.
2. Các lớp cụ thể của AlexNet và cách phân chia trên hai GPU
AlexNet có 8 lớp được học (5 lớp tích chập và 3 lớp kết nối đầy đủ), với tổng cộng khoảng 60 triệu tham số. Vì một GTX 580 không đủ hơn 3 GB VRAM cần thiết cho các giá trị kích hoạt, trọng số và gradient, Krizhevsky đã chia mạng theo chiều dọc thành hai luồng song song.
| Lớp | Loại | Tổng số bộ lọc / nơ-ron | Phân chia trên mỗi GPU | Trao đổi giữa các GPU |
|---|---|---|---|---|
| Đầu vào | Ảnh RGB | 224 × 224 × 3 | Sao chép vào cả hai GPU | Không có |
| Conv 1 | Tích chập 11×11 (bước trượt 4) + MaxPool | 96 bộ lọc | 48 bộ lọc trên mỗi GPU | Biệt lập (không đồng bộ) |
| Conv 2 | Tích chập 5×5 + MaxPool | 256 bộ lọc | 128 bộ lọc trên mỗi GPU | Biệt lập (chỉ đọc Conv 1 của chính GPU đó) |
| Conv 3 | Tích chập 3×3 | 384 bộ lọc | 192 bộ lọc trên mỗi GPU | Đồng bộ hoàn toàn (đọc cả 256 bản đồ từ hai GPU) |
| Conv 4 | Tích chập 3×3 | 384 bộ lọc | 192 bộ lọc trên mỗi GPU | Biệt lập (chỉ đọc Conv 3 của chính GPU đó) |
| Conv 5 | Tích chập 3×3 + MaxPool | 256 bộ lọc | 128 bộ lọc trên mỗi GPU | Biệt lập (chỉ đọc Conv 4 của chính GPU đó) |
| FC 6 | Kết nối đầy đủ + Dropout | 4,096 nơ-ron | 2,048 nơ-ron trên mỗi GPU | Đồng bộ hoàn toàn (kết nối tới mọi đầu ra Conv 5) |
| FC 7 | Kết nối đầy đủ + Dropout | 4,096 nơ-ron | 2,048 nơ-ron trên mỗi GPU | Đồng bộ hoàn toàn (kết nối tới mọi nơ-ron FC 6) |
| FC 8 | Kết nối đầy đủ (Softmax) | 1,000 lớp | 1,000 lớp (kết hợp) | Đồng bộ hoàn toàn (xuất các dự đoán ImageNet cuối cùng) |
- Sự chuyên biệt hóa đặc trưng một cách tự nhiên. Điều thú vị là do các lớp 1 và 2 không bao giờ trao đổi giữa các GPU, hai card liên tục phát triển những vai trò chuyên biệt. Một GPU học các bộ phát hiện cạnh và kết cấu không phụ thuộc màu sắc (các bộ lọc giống Gabor ở thang xám), trong khi GPU kia chuyên về các đốm và sắc độ theo màu cụ thể.
- Giảm thiểu nút thắt PCIe. Truyền dữ liệu qua bus PCIe của bo mạch chủ rất chậm. Bằng cách chỉ giới hạn trao đổi giữa các GPU ở Conv 3 và các lớp kết nối đầy đủ, Krizhevsky giúp GPU tính toán ở tốc độ tối đa mà không bị ngưng trệ vì truyền dữ liệu.
3. Những gì diễn ra tiếp theo trong kỷ nguyên ImageNet
Chiến thắng của AlexNet châm ngòi cho cuộc đua hằng năm tại cuộc thi ImageNet, đưa các mạng từ 8 lớp lên hơn 150 lớp chỉ trong ba năm.
- 2013 - ZFNet (trực quan hóa & tinh chỉnh). Matthew Zeiler và Rob Fergus giới thiệu các kỹ thuật giải tích chập để trực quan hóa những gì AlexNet thực sự nhìn thấy bên trong các lớp ẩn. Bằng cách giảm kích thước bộ lọc lớp đầu của AlexNet từ 11×11 xuống 7×7 và giảm bước trượt, ZFNet hạ tỷ lệ lỗi top-5 trên ImageNet từ 15.3% xuống 14.8%.
- 2014 - VGGNet (tăng độ sâu bằng các bộ lọc 3×3 đồng nhất). Các nhà nghiên cứu tại Oxford chứng minh rằng xếp chồng nhiều phép tích chập 3×3 nhỏ (tới 16 hoặc 19 lớp) hiệu quả hơn dùng các bộ lọc lớn riêng lẻ (như 11×11 hoặc 5×5). Hai lớp 3×3 xếp chồng bao phủ cùng vùng nhìn 5×5 nhưng có ít tham số hơn và thêm các phép kích hoạt ReLU phi tuyến, đưa tỷ lệ lỗi xuống 7.3%.
- 2014 - GoogLeNet / Inception (hiệu quả đa tỷ lệ). Google giới thiệu mô-đun Inception, chạy song song các phép tích chập 1×1, 3×3 và 5×5 trong cùng một lớp rồi hợp nhất các đầu ra. Bằng cách dùng các phép tích chập 1×1 ít tốn kém để giảm số kênh trước những phép tính tốn kém, GoogLeNet đạt 22 lớp và tỷ lệ lỗi 6.7% với số tham số ít hơn AlexNet 12 lần.
- 2015 - ResNet (kết nối tắt & 152 lớp). Việc chỉ xếp chồng thêm lớp cuối cùng làm giảm độ chính xác huấn luyện vì gradient biến mất trong quá trình lan truyền ngược. Microsoft Research giải quyết vấn đề này bằng các kết nối phần dư (kết nối tắt), cho phép dữ liệu đi vòng qua các lớp bằng những đường tắt đồng nhất trực tiếp. Điều này mở đường cho các mạng 152 lớp, đạt tỷ lệ lỗi top-5 là 3.57%, lần đầu tiên vượt qua mức hiệu suất chuẩn của con người (~5%).