Bản sao ChatGPT dựa trên GPT-2 được triển khai bằng C trong 3000 byte (2023)
(nicholas.carlini.com)-
Triển khai bản sao ChatGPT
- Chương trình này là một bản triển khai GPT-2 không có phụ thuộc.
- Nó tải các ma trận trọng số từ tệp TensorFlow và tệp BPE, rồi token hóa đầu vào bằng một bộ mã hóa cặp byte đơn giản.
- Nó triển khai một gói đại số tuyến tính cơ bản, định nghĩa kiến trúc transformer, thực hiện suy luận transformer, và giải token đầu ra bằng bộ giải mã BPE.
- Được viết bằng khoảng 3000 byte C.
- Được tối ưu hóa hiệu quả để mô hình GPT-2 Small có thể phản hồi trong vài giây trên thiết bị hiện đại.
- Triển khai KV caching và thuật toán nhân ma trận hiệu quả.
-
Cấu trúc chương trình
- Thư viện toán ma trận cơ bản (700 byte)
- Nhân ma trận nhanh (300 byte)
- Các lớp mạng nơ-ron (300 byte)
- Mô hình transformer (600 byte)
- Mã hóa cặp byte (400 byte)
- Vào/ra (200 byte)
- Tải trọng số (300 byte)
- Tải mã hóa cặp byte (300 byte)
-
Bối cảnh về ChatGPT và transformer
- ChatGPT là một ứng dụng cho phép trò chuyện với mô hình ngôn ngữ.
- GPT-4 là mô hình mới nhất và rất ấn tượng.
- Chương trình C này tái hiện cách ChatGPT hoạt động bằng GPT-2, một mô hình yếu hơn từ năm 2019.
- GPT-2 là một transformer nhận chuỗi từ có kích thước cố định làm đầu vào và dự đoán từ tiếp theo.
-
Giải thích mã C
-
Bắt đầu với toán ma trận (700 byte)
- Mạng nơ-ron được cấu thành từ các phép toán ma trận.
- Xây dựng một thư viện ma trận bằng cách dùng định nghĩa ma trận tối giản.
- Dùng macro để trích xuất logic dùng chung thành các meta-routine.
-
Nhân ma trận nhanh (300 byte)
- Phép nhân ma trận cơ bản được triển khai bằng ba vòng lặp.
- Nhờ cách bộ nhớ và cache hoạt động, việc đọc và ghi lặp lại cùng một vùng nhớ sẽ nhanh hơn.
-
Các lớp mạng nơ-ron (300 byte)
- Định nghĩa một số lớp mạng nơ-ron đặc biệt để viết transformer.
- Triển khai hàm kích hoạt GELU và hàm thiết lập tam giác dưới cần thiết cho causal attention.
-
Kiến trúc transformer (600 byte)
- Triển khai transformer trong 600 byte.
- Ở mỗi lớp, tính key, query và value, tạo ma trận attention, rồi kết hợp kết quả.
-
Mã hóa cặp byte (400 byte)
- Mô hình ngôn ngữ cần đầu vào có kích thước cố định nên sử dụng các mảnh từ để tạo token.
- Chia từ đã cho thành từng ký tự riêng lẻ, rồi hợp nhất các cặp token liền kề.
-
Tải trọng số (300 byte)
- Tải trọng số của mạng nơ-ron từ đĩa.
- Trọng số được tuần tự hóa dưới dạng số thực dấu phẩy động 32 bit.
-
Tải mã hóa cặp byte (300 byte)
- Tải từ vựng mã hóa cặp byte từ đĩa.
- Định dạng tệp bao gồm một danh sách mã hóa cặp byte.
-
-
Kết luận
- Có thể nén hàng chục năm phát triển của học máy vào vài nghìn byte.
- Đây là một ví dụ về mạng nơ-ron đơn giản, bao gồm mọi thứ ngoại trừ trọng số của mô hình thực tế.
1 bình luận
Ý kiến trên Hacker News
Khi dùng GPT-2 để mô phỏng trò chuyện với bạn bè, kết quả khá vui và đôi khi chính xác đến mức đáng ngạc nhiên. Tò mò không biết bước nhảy lớn giữa GPT-2 và GPT-3 đến từ mô hình lớn hơn, nhiều dữ liệu hơn, hay cả hai. RLHF tạo ra khác biệt lớn, nhưng ngay cả mô hình GPT-3 cơ bản cũng đã rất hữu ích nếu được cung cấp đủ ví dụ
Đây là một ví dụ hay cho thấy mạng nơ-ron đơn giản thực sự đơn giản đến mức nào. AI là thứ ma thuật đen chúng ta dùng để kiếm tiền
Chưa chạy thử đoạn mã, nhưng rất ấn tượng với kích thước nhỏ của nó. Các chương trình ELISA ban đầu còn lớn hơn. Trong 4 năm qua, người ta đã có thể ép thứ này xuống đến từng byte. Nếu ai có gợi ý ma thuật nằm ở đâu thì mong được giải thích. Không rõ là ở hàm GELU hay ở mô hình được tải về qua script bash
GPT-2 đã viết câu chuyện cổ tích tôi yêu thích. Liên kết: The Princess, the Fairy Godmother, and the Chest
Tò mò không biết GPT-2 có thực sự được tinh chỉnh để dùng cho chat hay không. Nếu không, tôi nghĩ gọi đây là bản sao ChatGPT thì hơi quá
LISP không phải lúc nào cũng tốt hơn C. Lần này thì chấp nhận được. Nếu ai bỏ lỡ liên kết mã nguồn thì đây: C-Chat-GPT-2
Tò mò không biết nó có thể chạy trên phần cứng nào, liệu có dùng được trọng số đã lượng tử hóa từ Hugging Face hay không, và nó đặc biệt phù hợp với loại bài toán hay truy vấn nào
Dạo này có thể dùng gptscript để dễ dàng tự triển khai ChatGPT của riêng mình. Liên kết: gptscript
Tôi không hiểu macro C giống biểu thức chính quy ở điểm nào. Macro C khớp các từ rồi thay thế bằng văn bản khác. Biểu thức chính quy thì khớp văn bản bằng các mẫu tương đối phức tạp, và tự nó không thực hiện thay thế văn bản
Tò mò không biết đã có ai chạy cục bộ để xem đầu ra mà GP2 này tạo ra trông như thế nào chưa