Một bản sao thủ công hoàn toàn của ChatGPT với chi phí 100 đô la và 8.000 dòng mã!
Andrej Karpathy , cựu giám đốc AI của Tesla, thành viên sáng lập OpenAI và chuyên gia AI, người đã tuyên bố sẽ làm việc toàn thời gian trong lĩnh vực giáo dục, đã im lặng trong một thời gian dài và cuối cùng, cuối cùng, cuối cùng, cuối cùng, ông đã ở đây để dạy một lớp học mới!
Tác phẩm mới nanochat được tác giả mô tả là một trong những tác phẩm "điên rồ" và tự mãn nhất.
Đây là một quy trình đào tạo/suy luận tối giản, đầy đủ tính năng được xây dựng từ đầu, triển khai phiên bản đơn giản của ChatGPT trong một cơ sở mã duy nhất với các phụ thuộc tối thiểu.
Chỉ cần bạn khởi động máy chủ GPU đám mây và chạy một tập lệnh, sẽ mất khoảng 4 giờ để có thể giao tiếp với mô hình ngôn ngữ lớn mà bạn đã đào tạo trong giao diện web tương tự như ChatGPT.
Toàn bộ dự án có khoảng 8.000 dòng mã và có thể triển khai các chức năng sau:
Đào tạo các trình phân tích cú pháp dựa trên ngôn ngữ Rust mới
Đào tạo trước một mô hình ngôn ngữ lớn với kiến trúc Transformer trên dữ liệu FineWeb và đánh giá điểm CORE bằng nhiều chỉ báo
Midtrain được thực hiện trên dữ liệu đối thoại trợ lý người dùng SmolTalk, dữ liệu câu hỏi trắc nghiệm và dữ liệu sử dụng công cụ.
Thực hiện tinh chỉnh hướng dẫn (SFT) và đánh giá hiệu suất của mô hình đối thoại trên dữ liệu Câu hỏi trắc nghiệm kiến thức thế giới (ARC-E/C), dữ liệu Toán học (GSM8K) và dữ liệu Mã (HumanEval)
Đào tạo học tăng cường (RL) tùy chọn của mô hình bằng thuật toán "GRPO" trên dữ liệu GSM8K
Triển khai suy luận mô hình hiệu quả trong công cụ suy luận, hỗ trợ bộ nhớ đệm KV, quy trình giải mã/điền trước đơn giản, sử dụng công cụ (trình thông dịch Python trong hoàn cảnh hộp cát nhẹ) và tương tác với mô hình thông qua CLI hoặc WebUI giống ChatGPT
Tạo một bảng báo cáo Markdown duy nhất tóm tắt toàn bộ quá trình đào tạo và suy luận, đồng thời thêm phần trình bày "trò chơi hóa" (chẳng hạn như hiển thị trực quan kết quả dưới dạng điểm số, tiến độ, v.v.)
Tổng chi phí chỉ khoảng 100 đô la (đào tạo trong 4 giờ trên 8×H100) để đào tạo và sao chép mô hình ChatGPT đơn giản có thể thực hiện các cuộc trò chuyện cơ bản, sáng tác thơ kể chuyện và trả lời các câu hỏi đơn giản.
Chỉ báo hiệu suất chung như sau:
Sau khoảng 12 giờ đào tạo, hiệu suất của mô hình trên chỉ báo CORE có thể vượt qua GPT-2.
Nếu chi phí tăng thêm khoảng 1.000 đô la (thời gian đào tạo khoảng 41,6 giờ), hiệu suất của mô hình sẽ được cải thiện đáng kể và có thể giải quyết các bài toán/lập trình đơn giản và các câu hỏi trắc long.
Để đưa ra một ví dụ cụ thể: sau 24 giờ đào tạo, một mô hình có độ sâu 30 có thể đạt điểm trên 40 trên dữ liệu MMLU, trên 70 trên dữ liệu ARC-Easy và trên 20 trên dữ liệu GSM8K (tương đương với mức tiêu thụ tỷ lệ băm của GPT-3 Small 125M, chỉ bằng một phần nghìn của GPT-3).
Kapasi cho biết mục tiêu của ông là tích hợp toàn bộ công nghệ "cơ sở vững chắc" này thành một cơ sở mã thống nhất, tối giản, dễ đọc, có thể sửa đổi và dễ phân phối.
Nanochat sẽ là dự án cuối cùng của khóa học LLM101n (hiện vẫn đang được phát triển).
Tôi cho rằng nó có tiềm năng được phát triển thành một khung công cụ nghiên cứu hoặc công cụ đánh giá chuẩn, giống như nanoGPT trước đây. Dự án vẫn chưa được tối ưu hóa hoàn toàn (thực tế, vẫn còn lượng lớn chỗ cần cải thiện), nhưng nhìn chung, khung đã đủ hoàn thiện để phát hành trên GitHub, và tất cả mô-đun tiếp theo đều có thể được cộng đồng tối ưu hóa thêm.
Cư dân mạng đang háo hức chờ đợi tác phẩm mới đã phát cuồng. Ngay khi dự án được phát hành, số lượng sao trên GitHub đã tăng vọt lên 4,8 nghìn:
Tuyệt! Tôi có thể ghi "Kỹ sư ML" vào CV sau khi chạy dự án này một lần!
Những gì bạn phát hành không chỉ là mã, mà còn là trí tuệ dễ hiểu, giá trị bùng nổ, Shuan Q.
Trong phần bình luận, Kapasi cũng giải thích rằng kiến trúc cơ bản của nanochat tương tự như Llama, nhưng đơn giản hơn, và cũng vay mượn một số thiết kế của modded-nanoGPT. Mục tiêu chung là tìm ra một cơ sở hạ tầng mạnh mẽ cho các mô hình ở quy mô này.
Và dự án này về cơ bản hoàn toàn được viết tay .
Tôi đã thử sử dụng các tác nhân như Claude hoặc Codex để hỗ trợ, nhưng kết quả rất tệ và gần như vô ích. Có lẽ vì cấu trúc của kho lưu trữ này khác với cách phân phối dữ liệu đào tạo của chúng, nên chúng đơn giản là không "khớp".
Không cần phải nói thêm nữa, sau đây là hướng dẫn chi tiết để bắt đầu sử dụng nanochat.
ChatGPT tốt nhất bạn có thể tạo với giá 100 đô la
Tôi đã khởi chạy một máy chủ H100 8 card từ Lambda GPU Cloud, có giá khoảng 24 đô la một giờ, vì vậy tôi phải chạy đua với thời gian.
Thiết lập hoàn cảnh
Sao chép dự án:
Mục tiêu là đào tạo một mô hình ChatGPT tốt nhất với giá 100 đô la, tham khảo"speedrun". Tập lệnh speedrun.sh được thiết kế để chạy từ đầu đến cuối trên một máy chủ hoàn toàn mới.
Nhưng sau đó, Kapasi bước trong đó bước.
Trước tiên, hãy đảm bảo bạn đã cài đặt trình quản lý dự án uv phổ biến. Cài đặt uv, tạo một hoàn cảnh ảo mới trong mục lục .venv, lấy tất cả các phụ thuộc và sau đó kích hoạt hoàn cảnh. Bằng cách này, khi bạn nhập python, bạn sẽ sử dụng Python trong hoàn cảnh ảo thay vì Python của hệ thống:
Tiếp theo, bạn cần cài đặt Rust/Cargo để có thể biên dịch một bộ mã hóa Rust tùy chỉnh . Việc giới thiệu một bộ mã hóa mới/tùy chỉnh khá rắc rối, nhưng thật không may, Kapathy cảm thấy phiên bản Python trong dự án minbpe ban đầu quá chậm, còn bộ mã hóa huggingface thì quá cồng kềnh và khó hiểu.
Do đó, chúng tôi đã tạo ra trình phân đoạn từ mới của riêng mình dành riêng cho mục đích đào tạo (đã được kiểm tra để phù hợp với phiên bản Python), nhưng chúng tôi vẫn sẽ sử dụng tiktoken của OpenAI để đảm bảo hiệu quả trong quá trình suy luận.
Bây giờ chúng ta hãy biên dịch trình phân tích cú pháp:
Đào tạo từ phân đoạn
Tiếp theo, chúng ta cần thu thập dữ liệu đào tạo trước để có thể: 1) đào tạo bộ phân đoạn từ; 2) đào tạo trước mô hình.
Dữ liệu tiền đào tạo là nội dung văn bản của lượng lớn các trang web . Ở đây, chúng tôi sẽ sử dụng dữ liệu FineWeb-EDU.
Thông thường, bạn có thể sử dụng hugface datasets.load_dataset() trực tiếp, nhưng Karpathy không thích nó quá phức tạp, nặng nề và che mất logic đơn giản, vì vậy tôi đã đóng gói lại toàn bộ dữ liệu thành các phân đoạn đơn giản, được xáo trộn hoàn toàn để có thể tùy ý dễ dàng và hiệu quả theo ý muốn, đồng thời tải lại phiên bản sample-100B của nó dưới dạng karpathy/fineweb-edu-100b-shuffle.
Trên trang này, bạn cũng có thể xem trước văn bản mẫu từ dữ liệu . Mỗi phân đoạn là một tệp parquet đơn giản với khoảng 0,25 triệu ký tự, chiếm khoảng 100 MB trên ổ đĩa khi nén (định dạng gzip). Tổng cộng có 1822 phân đoạn, nhưng chỉ cần 240 trong đó để huấn luyện một mô hình độ sâu 20.
Bây giờ chúng ta hãy bắt đầu tải xuống toàn bộ dữ liệu. Dung lượng khoảng 24GB, nhưng thường khá nhanh trên các máy chủ đám mây:
Theo mặc định, tất cả những thứ này sẽ được tải xuống mục lục~/.cache/nanochat.
Sau khi tải xuống hoàn tất, chúng tôi bắt đầu huấn luyện bộ mã hóa tokenizer—bộ mã hóa tokenizer chịu trách nhiệm chuyển đổi giữa các chuỗi và một bảng mã ký hiệu. Theo mặc định, kích thước từ vựng được sử dụng để huấn luyện là 2¹⁶ = 65.536 token (một con số tốt), trong đó một số token được dành riêng làm token đặc biệt để sử dụng trong chế độ trò chuyện sau này. Bộ huấn luyện chứa 2B ký tự, và việc huấn luyện chỉ mất khoảng một phút.
Thuật toán đào tạo hoàn toàn giống với OpenAI (phân tách biểu thức chính quy, BPE cấp byte). Để biết thêm thông tin, hãy xem video của Kapathy về các kỹ thuật mã hóa.
Sau khi quá trình đào tạo hoàn tất, bạn có thể đánh giá phân tích cú pháp:
Kết quả đánh giá cho thấy tỷ lệ nén đạt khoảng 4,8 (tức là trung bình 4,8 ký tự trong văn bản gốc được nén thành 1 token). Kết quả so sánh với bộ phân đoạn từ GPT-2 và GPT-4 cũng có thể được xem xét.
So với GPT-2 (có 50.257 mã thông báo), nó nén văn bản tốt hơn nhìn chung và chỉ kém hơn một chút về nội dung toán học:
So với GPT-4, hiệu suất của nó không nổi trội, nhưng điều quan trọng cần lưu ý là vốn từ vựng lớn hơn của GPT-4 (100.277 token). GPT-4 đặc biệt vượt trội trong xử lý đa ngôn ngữ (một kết quả hợp lý khi xét đến việc dữ liệu FineWeb tập trung nhiều vào nội dung tiếng Anh), và nó cũng vượt trội về mã hóa và toán học:
Mặc dù vậy, ngay cả với vốn từ vựng nhỏ hơn, chúng tôi vẫn vượt qua GPT-4 một chút trên dữ liệu FineWeb - đây là dữ liệu chúng tôi đã đào tạo, do đó, trình phân tích cú pháp của chúng tôi hoàn toàn phù hợp với phân phối tài liệu đó (ví dụ: có thể có lợi hơn khi nén văn bản tiếng Anh).
Đào tạo trước
Trước khi bắt đầu đào tạo trước, bạn cần tải xuống một tệp khác mà Kapathy gọi là " đánh giá bundle ".
Trong quá trình tiền huấn luyện, tập lệnh sẽ định kì đánh giá chỉ báo CORE. Bạn có thể đọc một số chi tiết trong bài báo DCLM, nhưng về cơ bản, đây là một chỉ báo tốt, được chuẩn hóa và tổng quát để đo lường hiệu suất của một mô hình trên lượng lớn dữ liệu tự động hoàn thành.
Dữ liệu này bao gồm HellaSwag, jeopardy, bigbench QA wikidata, ARC-Easy/Challenge, copa, commonsense qa, piqa, lambada, winograd, boolq, v.v. (tổng cộng 22).
Tải xuống và giải nén gói đánh giá và đặt mục lục gói đánh giá vào mục lục cơ sở ~/.cache/nanochat/eval_bundle:
Ngoài ra, bạn cũng nên thực hiện thêm một thiết lập nữa (mặc dù không bắt buộc):
Cấu hình wandb để bạn có thể xem các biểu đồ đẹp trong quá trình đào tạo. uv đã cài đặt wandb, nhưng bạn vẫn cần tạo tài khoản và đăng nhập:
Bây giờ chúng ta có thể bắt đầu tiền huấn luyện! Đây là phần tốn nhiều tính toán nhất. Chúng ta huấn luyện một Mô hình Ngôn ngữ Lớn (LLM) để nén văn bản trang web internet bằng cách dự đoán mã thông báo tiếp theo trong một chuỗi. Trong quá trình này, Mô hình Ngôn ngữ Lớn thu thập được lượng lớn kiến thức về thế giới:
Ở đây, chúng tôi khởi chạy huấn luyện trên 8 GPU bằng tập lệnh scripts/base_train.py. Chúng tôi đang huấn luyện một Transformer 20 lớp. Theo mặc định, mỗi GPU xử lý 32 hàng dữ liệu với 2048 token mỗi hàng trong lần lần duyệt tiến/lùi, tổng cộng là 32 × 2048 = 2¹⁹ = 524.288 ≈ 0,5 triệu token cho mỗi bước tối ưu hóa.
Nếu bạn đã thiết lập wandb, bạn có thể thêm --run=speedrun (tất cả các tập lệnh đào tạo đều hỗ trợ tham số này) để đặt tên lần chạy và ghi lại dữ liệu có liên quan.
Khi bạn bắt đầu đào tạo, bạn sẽ thấy kết quả tương tự như thế này (lượng lớn nội dung đã được lược bỏ để ngắn gọn):
Như bạn có thể thấy, bộ chuyển đổi này có 1280 kênh và 10 đầu chú ý, mỗi đầu có dim=128. Nó có khoảng 560 triệu tham số. Để tuân thủ quy luật tỷ lệ Chinchilla, điều này có nghĩa là chúng ta cần sử dụng 560 triệu × 20 ≈ 11,2 tỷ mã thông báo để huấn luyện.
Vì mỗi bước của trình tối ưu hóa xử lý 524.288 mã thông báo, điều này có nghĩa là 11,2B/0,5M ≈ Lần.
Bằng cách nhân số FLOP ước tính trên mỗi mã thông báo với tổng số mã thông báo, chúng ta có thể thấy rằng đây sẽ là một mô hình có chi phí tính toán khoảng 4e19 FLOP.
Tốc độ học được tự động điều chỉnh theo 1/sqrt(dim) vì các mô hình lớn hơn thích tốc độ học nhỏ hơn.
Chúng tôi sử dụng Muon để tối ưu hóa ma trận và AdamW để tối ưu hóa việc nhúng và giải nhúng. Không có tham số nào khác có thể huấn luyện được trong mô hình này (chẳng hạn như độ lệch, tham số rmsnorm, v.v.). Quá trình huấn luyện định kì báo cáo"bộ xác thực bpb", là số bit trên mỗi byte trên dữ liệu xác thực.
Số bit trên mỗi byte là một chỉ báo tốt hơn so với mức mất entropy chéo thông thường vì nó chuẩn hóa thêm mức mất trên mỗi mã thông báo theo số byte trên mỗi mã thông báo, khiến chỉ báo này không phụ thuộc vào trình phân tích mã thông báo.
Vì vậy, cho dù bạn sử dụng bộ phân tích cú pháp với vốn từ vựng nhỏ hay bộ phân tích cú pháp với vốn từ vựng lớn thì giá trị này vẫn tương đương nhau, trong khi tổn thất entropy chéo thô thì không.
Lưu ý rằng mỗi bước mất khoảng 0,5 giây, lrm là hệ số suy giảm tốc độ học (giảm tuyến tính xuống 0 gần cuối quá trình đào tạo) và MFU (tận dụng flops của mô hình) báo cáo có vẻ khá tốt, gần đạt một nửa, nghĩa là chúng ta tận dụng hoàn toàn sức mạnh tính toán bfloat16 khả dụng.
Bây giờ, hãy đợi khoảng 3 giờ cho đến khi 4e19 FLOP tính toán đó hoàn tất … Trong biểu đồ wandb của bạn, bạn sẽ thấy nội dung tương tự như thế này:
Theo thời gian, bpb giảm, đây là một dấu hiệu tốt (cho thấy mô hình đang ngày càng chính xác hơn trong việc dự đoán token tiếp theo). Ngoài ra, điểm CORE cũng đang tăng.
Ngoài chỉ báo gần đúng này, bạn cũng có thể đánh giá mô hình toàn diện hơn:
Có thể thấy rằng bpb của tập huấn luyện/tập xác thực đạt khoảng 0,81 và chỉ báo CORE tăng lên 0,22.
Để so sánh, gói đánh giá bao gồm điểm CORE của mô hình GPT-2. Cụ thể, điểm CORE là 0,22 cao hơn một chút so với điểm GPT-2 lớn (0,21), nhưng thấp hơn một chút so với điểm GPT-2 xl (tức là GPT-2 "chuẩn", là 0,26).
Lúc này, mô hình hoạt động như một công cụ tự động hoàn thành nâng cao, vì vậy chúng ta có thể chạy một số lời nhắc để cảm nhận kiến thức được lưu trữ trong mô hình. Tệp base_loss.py chạy các lời nhắc này. Các lời nhắc này bao gồm:
Văn bản hoàn chỉnh như sau:
Vì vậy, mô hình biết rằng Paris là thủ đô của Pháp, Au là viết tắt của vàng, thứ Bảy đứng sau thứ Sáu, "lạnh" là từ trái nghĩa với "nóng" và thậm chí còn biết tên các hành tinh trong hệ mặt trời của chúng ta.
Tuy nhiên, nó vẫn chưa chắc chắn về màu sắc của bầu trời và gặp khó khăn khi giải các bài toán đơn giản.
Đối với một mô hình tốn 72 đô la để đào tạo, điều này không quá tệ. Quá trình suy luận sử dụng một lớp Engine tùy chỉnh, tận dụng bộ nhớ đệm KV để suy luận hiệu quả và cũng chỉ đơn giản triển khai hai giai đoạn suy luận phổ biến: tiền điền và giải mã.
Lớp Engine của chúng tôi cũng hỗ trợ việc sử dụng các công cụ (như trình thông dịch Python), rất hữu ích khi đào tạo trên dữ liệu GSM8K (sẽ được mô tả chi tiết sau).
Giữa quá trình đào tạo
Tiếp theo là đào tạo giữa kỳ, nhằm tinh chỉnh thêm mô hình trên dữ liệu smol-SmolTalk.
Thuật toán này hoàn toàn giống với tiền huấn luyện, nhưng dữ liệu đã trở thành nội dung hội thoại, và mô hình sẽ thích ứng với các mã thông báo đặc biệt mới được sử dụng để xây dựng cấu trúc hội thoại nhiều lượt. Giờ đây, lần cuộc hội thoại trông như thế này, gần giống với định dạng trò chuyện của OpenAI Harmony:
Các mã thông báo hiển thị như <|example|> là các mã thông báo đặc biệt tuân theo định dạng mã thông báo đặc biệt của OpenAI. Chúng rất hữu ích cho các điều chỉnh khác nhau của mô hình trong giai đoạn giữa quá trình huấn luyện :
Mô hình học các mã thông báo đặc biệt liên quan đến hội thoại nhiều lượt (ngoại trừ mã thông báo <|bos|> được sử dụng để phân tách tài liệu, không có trong quá trình đào tạo trước mô hình cơ sở).
Mô hình này thích ứng với việc phân phối dữ liệu của các cuộc hội thoại thay vì dữ liệu của các tài liệu Internet.
Việc dạy mô hình long là rất quan trọng đối với chúng tôi, vì nó không thể học được điều này từ dữ liệu internet ngẫu nhiên ở quy mô nhỏ như vậy. Cụ thể, mô hình phải học cách liên kết một vài lựa chọn với một vài chữ cái (chẳng hạn như ABCD) và sau đó đưa ra câu trả lời đúng. Điều này đạt được bằng cách trộn 100.000 câu hỏi trắc nghiệm từ bộ dữ liệu huấn luyện bổ trợ MMLU. Điều quan trọng là phải hiểu rằng vấn đề không phải là mô hình thiếu kiến thức liên quan, mà là nó không hiểu cách thức hoạt động của các câu hỏi trắc nghiệm và không thể diễn đạt kiến thức đó. Điều này rất quan trọng vì nhiều đánh giá mô hình phổ biến, chẳng hạn như MMLU, sử dụng các câu hỏi trắc nghiệm.
Bạn có thể dạy mô hình sử dụng nhiều công cụ khác nhau. Với mục đích này, chúng ta sẽ dạy mô hình sử dụng trình thông dịch Python bằng cách đặt các lệnh Python giữa các mã thông báo đặc biệt <|python_start|> và <|python_end|>. Điều này sẽ hữu ích sau này khi giải các bài toán GSM8K.
Có nhiều cách điều chỉnh khác mà bạn cũng có thể luyện tập trong quá trình luyện tập, chẳng hạn như mở rộng độ dài ngữ cảnh (chưa được khám phá).
Dữ liệu hỗn hợp đào tạo giữa kỳ mặc định như sau:
Sau đó bắt đầu như sau:
Lần chạy lần chỉ mất khoảng 8 phút, ngắn hơn nhiều so với thời gian đào tạo trước đó khoảng 3 tiếng. Giờ đây, khi mô hình đã là một mô hình trò chuyện thực sự, có thể đóng nhân vật trợ lý để trả lời các câu hỏi của người dùng, có thể đánh giá:
Các kết quả sau đây đã thu được cho mô hình ở giai đoạn này:
Bạn có thể thấy:
Kiến thức Thế giới: Ba câu hỏi đầu tiên (ARC-E/C và MMLU) là các bài kiểm tra trắc nghiệm, đo lường kiến thức thế giới của mô hình trong nhiều lĩnh vực. Vì có bốn lựa chọn (A, B, C, D), nên việc đoán ngẫu nhiên có tỷ lệ chính xác khoảng 25%, do đó mô hình đã hoạt động tốt hơn so với đoán ngẫu nhiên. (Các câu hỏi trắc nghiệm khá khó đối với một mô hình nhỏ như vậy.)
Toán: GSM8K là một bài toán cấp tiểu học. Hiệu suất ban đầu của chúng tôi ở đây là 0% vì mô hình phải viết đáp án số thực tế. Hiệu suất của chúng tôi vẫn chưa thực sự tốt, chỉ giải được 2% bài toán.
Mã: HumanEval là công cụ chuẩn hóa mã hóa Python, hiệu suất chuẩn ngẫu nhiên là 0%.
ChatCORE: Đây là nỗ lực của Kapathy nhằm sao chép phương pháp đánh giá điểm CORE cho các mô hình cơ sở và mở rộng sang các mô hình trò chuyện. Cụ thể, hiệu suất cơ sở được trừ đi khỏi tất cả chỉ báo trên, cho kết quả điểm số từ 0 đến 1 (ví dụ: một mô hình ngẫu nhiên sẽ đạt điểm 0, chứ không phải 25% trên MMLU), và điểm trung bình của tất cả nhiệm vụ báo cáo . Phương pháp này cung cấp một con số duy nhất tóm tắt sức mạnh của mô hình hiện tại.
Đánh giá này vẫn còn khá chưa đầy đủ và vẫn còn nhiều khía cạnh khác có thể đo lường được nhưng vẫn chưa được đo lường.
Thực sự không có biểu đồ nào tuyệt vời để thể hiện bước này, nhưng đây là một ví dụ từ lần chạy thử giữa chừng trước đó của một mô hình khác lớn hơn, chỉ để cung cấp cho bạn ý tưởng về chỉ báo này trông như thế nào khi tăng trong quá trình chạy tinh chỉnh:
Điều chỉnh có giám sát
Sau khóa đào tạo giữa kỳ là giai đoạn điều chỉnh có giám sát (SFT).
Đây là vòng tinh chỉnh bổ sung đối với dữ liệu đàm thoại, lý tưởng nhất là bạn nên cẩn thận lựa chọn dữ liệu tốt có chất lượng cao nhất và đây cũng là nơi bạn thực hiện đào tạo về an toàn (như đào tạo trợ lý từ chối các yêu cầu không phù hợp).
Mô hình của chúng tôi thậm chí còn chưa chắc chắn về màu sắc của bầu trời, nên có lẽ hiện tại nó vẫn an toàn cho các mối nguy sinh học. Một sự điều chỉnh miền xảy ra ở đây là SFT kéo dài dữ liệu hàng và làm đầy chúng để mô phỏng định dạng được sử dụng trong quá trình thử nghiệm.
Nói cách khác, các ví dụ không còn được nối ngẫu nhiên thành các hàng dài để tăng hiệu quả huấn luyện như trước/giữa quá trình huấn luyện. Việc khắc phục sự không khớp miền này là một cải tiến nhỏ khác mang tính "siết chặt". Chúng ta có thể chạy SFT và đánh giá lại:
Quá trình này cũng chỉ mất khoảng 7 phút để chạy và bạn sẽ thấy sự cải thiện nhẹ ở mọi chỉ báo:
Cuối cùng, chúng ta có thể nói chuyện với mô hình như một người dùng!
Bạn thực sự có thể giao tiếp với nó sau khi hoàn thành khóa đào tạo giữa kỳ, nhưng bây giờ sẽ tốt hơn. Bạn có thể giao tiếp với nó thông qua cửa sổ terminal (phương pháp 1) hoặc giao diện web (phương pháp 2):
Tập lệnh chat_web sử dụng FastAPI để cung cấp dịch vụ Engine. Để truy cập chính xác, ví dụ: trên Lambda, hãy sử dụng địa chỉ IP công khai của nút của bạn theo sau là số cổng, ví dụ: http://209.20.xxx.xxx:8000/.
Trông sẽ tuyệt lắm, giống thế này này:
Sẽ không sớm giành được chiến thắng trong các cuộc thi vật lý hay thơ ca, nhưng nói như vậy thì thật tuyệt khi đạt được điều này với ngân sách nhỏ như vậy, và dự án này vẫn chưa hoàn thiện .
Học tăng cường
Giai đoạn cuối cùng của “chạy tốc độ” là học tăng cường.
Học tăng cường dựa trên phản hồi của con người (RLHF) là một phương pháp tốt có thể cải thiện hiệu suất thêm vài phần trăm và khắc phục nhiều lỗi mô hình do chính chu kỳ lấy mẫu gây ra - chẳng hạn như ảo giác, vòng lặp vô hạn, v.v.
Nhưng ở quy mô của chúng tôi, đây không phải là những cân nhắc quan trọng. Tuy nhiên, trong số tất cả dữ liệu chúng tôi đã sử dụng cho đến nay, GSM8K là tập dữ liệu duy nhất có hàm phần thưởng rõ ràng, khách quan (là đáp án đúng cho bài toán).
Vì vậy, chúng ta có thể chạy tập lệnh RL(/GRPO) để cải thiện trực tiếp hiệu suất của câu trả lời thông qua chu trình học tăng cường đơn giản bằng cách xen kẽ lấy mẫu và đào tạo:
Trong quá trình học tăng cường, mô hình sẽ duyệt qua tất cả các câu hỏi GSM8K trong tập huấn luyện và lấy mẫu trạng thái hoàn thành. Sau đó, chúng tôi sẽ thưởng cho các kết quả được lấy mẫu này và huấn luyện trên các mẫu nhận được phần thưởng cao.
Chúng tôi sử dụng vòng lặp đào tạo GRPO được đơn giản hóa cao, ví dụ, không sử dụng vùng tin cậy (bỏ qua mô hình tham khảo và quy tắc KL), sử dụng chính sách (bỏ qua tỷ lệ + cắt xén PPO), sử dụng chuẩn hóa kiểu GAPO (dựa trên chuẩn hóa cấp mã thông báo thay vì chuẩn hóa cấp chuỗi) và hàm lợi thế chỉ đơn giản là một sự dịch chuyển phần thưởng đơn giản theo giá trị trung bình (bỏ qua chuẩn hóa điểm z bằng cách chia cho độ lệch chuẩn).
Kết quả là một thứ trông giống thuật toán REINFORCE hơn, nhưng vẫn giữ lại thành phần GR ("tương đối nhóm") để tính toán sự thống trị của phần thưởng. Phương pháp này hoạt động khá tốt với quy mô và tính đơn giản hiện tại nhiệm vụ . Xem kịch bản để biết thêm chi tiết.
Hiện tại, học tăng cường được mặc định chú thích vì nó chưa được điều chỉnh tốt và chúng tôi không có RLHF hoàn chỉnh và tổng quát.
Học tăng cường chỉ được thực hiện trên GSM8K, đó là lý do tại sao cờ -a được sử dụng để giới hạn đánh giá chỉ trong GSM8K. Vì học tăng cường giống như việc rút tín hiệu giám sát qua một ống hút, quá trình này sẽ diễn ra trong một khoảng thời gian đáng kể.
Ví dụ, sau khi chạy khoảng 1,5 giờ với cài đặt mặc định, kết quả như sau:
điểm
Điều cuối cùng Kapathy chỉ ra là tệp report.md xuất hiện trong thư mục dự án. Tệp này chứa rất nhiều thông tin chi tiết về quá trình chạy và một bảng tóm tắt đẹp mắt ở cuối:
Nhân vật: 333.989
Dòng: 8.304
Tập tin: 44
Token (xấp xỉ): 83.497
Phụ thuộc (dòng uv.lock): 2.004
Tổng thời gian: 3 giờ 51 phút
Điều quan trọng cần lưu ý là do hỗ trợ hoàn thiện cho học tăng cường (RL), nên nó bị loại khỏi tổng thời gian tính toán. Toàn bộ quá trình, tính đến giai đoạn tinh chỉnh có giám sát (SFT), mất 3 giờ 51 phút, với tổng chi phí là (3 + 51 / 60) × 24 = 92,4 đô la (nếu bao gồm cả học tăng cường, tổng thời gian hiện tại sẽ gần 5 giờ hơn).
Thậm chí còn dư lại 8 đô la để mua kem.
Đến lượt bạn rồi
Với nanochat, bạn có thể điều chỉnh bất kỳ phần nào.
Có nhiều ý tưởng bạn có thể thử: thay đổi bộ phân tích cú pháp, sửa đổi dữ liệu tùy ý, điều chỉnh siêu tham số, cải thiện quy trình tối ưu hóa. Bạn cũng có thể muốn huấn luyện một mô hình lớn hơn. Kho lưu trữ này được thiết lập để giúp bạn thực hiện việc này một cách dễ dàng.
Chỉ cần thay đổi số lượng lớp bằng tham số --depth, và tất cả các thiết lập liên quan khác sẽ tự động điều chỉnh dựa trên tham số này như một lần điều chỉnh độ phức tạp duy nhất. Ví dụ, số lượng kênh sẽ tăng lên, tốc độ học sẽ được điều chỉnh tương ứng, v.v.
Về nguyên tắc, chỉ cần thay đổi độ sâu, bạn có thể khám phá toàn bộ "sê-ri nhỏ" các mô hình nanochat. Sử dụng độ sâu lớn hơn và chờ đợi lâu hơn về mặt lý thuyết sẽ mang lại kết quả tốt hơn đáng kể.
Bạn cần truyền tham số độ sâu vào trong giai đoạn tiền huấn luyện của base_train.py. Ví dụ: để có được một mô hình có chỉ báo CORE khoảng 0,25 và hiệu suất gần với GPT-2, thì depth=26 là một lựa chọn tốt.
Tuy nhiên, khi đào tạo các mô hình lớn hơn, bạn cần điều chỉnh kích thước lô tối đa của thiết bị, ví dụ: từ 32 thành 16:
Mã sẽ phát hiện sự thay đổi này và tự động bù trừ, trải qua lần chu kỳ tích lũy gradient để đạt được kích thước lô mục tiêu là 0,5M. Để huấn luyện một mô hình có độ sâu = 30, bạn cần giảm thêm các thiết lập:
Và vân vân. Bạn có thể thoải mái đọc mã, Kapathy đã cố gắng hết sức để mã dễ đọc bằng cách thêm chú thích, do đó mã sạch và dễ hiểu.
Tất nhiên, bạn cũng có thể đóng gói toàn bộ nội dung và hỏi mô hình ngôn ngữ lớn yêu thích của mình, hoặc đơn giản hơn, sử dụng DeepWiki của Devin/Cognition để đặt câu hỏi về kho mã này. Chỉ cần đổi URL của kho mã từ github.com thành deepwiki.com, chẳng hạn như nanochat DeepWiki.
Vậy là xong, hãy điều chỉnh bất kỳ phần nào của quy trình, chạy lại và trong đó hưởng nhé!
Một chuyên gia rất nổi tiếng trong lĩnh vực AI tập trung vào giáo dục
Kapathy trước đây là người đứng đầu bộ phận AI tại Tesla trước khi gia nhập OpenAI và rời công ty vào tháng 2 năm ngoái.
Ông cực kỳ nổi tiếng trong toàn bộ cộng đồng AI, phần lớn trong số đó đến từ các khóa học của ông.
Ngoài việc chia sẻ bài viết blog đầu tiên của mình và sê-ri video hướng dẫn trên Youtube sau này, ông còn hợp tác với Fei-Fei Li để mở khóa học học độ sâu đầu tiên của Đại học Stanford mang tên CS231n "Mạng nơ-ron tích chập và Nhận dạng hình ảnh".
Nhiều học giả và doanh nhân ngày nay đã bắt đầu sự nghiệp của mình với ông.
Niềm đam mê giáo dục của Kapasi có thể bắt nguồn từ thời còn là sinh viên, khi anh dạy mọi người cách giải Rubik trực tuyến.
Tháng 7 năm ngoái, Kapathy, người đã từ chức tại OpenAI, bất ngờ công bố công ty khởi nghiệp của mình và thành lập một trường học chuyên về AI mới - Eureka Labs .
Làm thế nào để hiểu AI bản địa?
Hãy tưởng tượng bạn đang học những tài liệu chất lượng cao với Feynman, người sẽ hướng dẫn bạn từng bước một.
Thật không may, ngay cả khi chúng ta có thể tìm được một bậc thầy như Feynman trong mọi lĩnh vực, họ cũng không thể đích thân hướng dẫn 8 tỷ người trên hành tinh này.
Nhưng AI thì có thể, và AI có sự kiên nhẫn vô hạn và thành thạo mọi ngôn ngữ trên thế giới.
Do đó, Kapasi muốn tạo ra "sự kết hợp giữa giáo viên + trí tuệ nhân tạo" có thể vận hành toàn bộ khóa học trên một nền tảng chung.
Nếu chúng ta thành công, mọi người sẽ dễ dàng học được bất cứ điều gì, mở rộng phạm vi và mức độ của chính nền giáo dục.
Sản phẩm đầu tiên của Eureka Labs cũng là khóa học đầu tiên, LLM101n.
Chúng tôi sẽ hướng dẫn bạn từng bước để xây dựng một mô hình tạo câu chuyện lớn tương tự như ChatGPT, cũng như một ứng dụng web hỗ trợ.
Kho lưu trữ GitHub: https://github.com/karpathy/nanochat
Hướng dẫn chi tiết: https://github.com/karpathy/nanochat/discussions/1
Liên kết tham khảo: https://x.com/karpathy/status/1977755427569111362
Bài viết này trích từ tài khoản công khai WeChat "Quantum Bit" , tác giả: Xifeng và được 36Kr cho phép xuất bản.