GN⁺: GPT-2 기반 3000바이트 C로 구현된 ChatGPT 클론 (2023)
(nicholas.carlini.com)-
ChatGPT 클론 구현
- 이 프로그램은 GPT-2의 의존성 없는 구현임.
- TensorFlow 파일에서 가중치 행렬과 BPE 파일을 로드하고, 입력을 간단한 바이트 쌍 인코더로 토큰화함.
- 기본 선형 대수 패키지를 구현하고, 변환기 아키텍처를 정의하며, 변환기 추론을 수행하고, BPE 디코더로 출력을 비토큰화함.
- 약 3000바이트의 C로 작성됨.
- 효율적으로 최적화되어 GPT-2 Small 모델이 현대 기기에서 몇 초 내에 응답할 수 있음.
- KV 캐싱과 효율적인 행렬 곱셈 알고리즘을 구현함.
-
프로그램 구조
- 기본 행렬 수학 라이브러리 (700바이트)
- 빠른 행렬 곱셈 (300바이트)
- 신경망 레이어 (300바이트)
- 변환기 모델 (600바이트)
- 바이트 쌍 인코딩 (400바이트)
- 입출력 (200바이트)
- 가중치 로딩 (300바이트)
- 바이트 쌍 인코딩 로딩 (300바이트)
-
ChatGPT와 변환기 배경
- ChatGPT는 언어 모델과 대화할 수 있는 애플리케이션임.
- GPT-4는 최신 모델로 매우 인상적임.
- 이 C 프로그램은 2019년의 약한 모델인 GPT-2를 사용하여 ChatGPT의 동작을 구현함.
- GPT-2는 고정 크기의 단어 시퀀스를 입력으로 받아 다음 단어를 예측하는 변환기임.
-
C 코드 설명
-
행렬 수학 시작하기 (700바이트)
- 신경망은 행렬 연산으로 구성됨.
- 최소한의 행렬 정의를 사용하여 행렬 라이브러리를 구축함.
- 매크로를 사용하여 공통 로직을 메타 루틴으로 추출함.
-
빠른 행렬 곱셈 (300바이트)
- 기본 행렬 곱셈은 세 개의 루프를 사용하여 구현됨.
- 메모리와 캐시의 작동 방식 덕분에 동일한 메모리를 반복적으로 읽고 쓰는 것이 더 빠름.
-
신경망 레이어 (300바이트)
- 변환기를 작성하기 위해 몇 가지 특별한 신경망 레이어를 정의함.
- GELU 활성화 함수와 인과적 주의에 필요한 하위 대각선 설정 함수 등을 구현함.
-
변환기 아키텍처 (600바이트)
- 변환기를 600바이트로 구현함.
- 각 레이어에서 키, 쿼리, 값을 계산하고, 주의 행렬을 생성하여 결과를 결합함.
-
바이트 쌍 인코딩 (400바이트)
- 언어 모델은 고정 크기의 입력이 필요하므로 단어 조각을 사용하여 토큰을 생성함.
- 주어진 단어를 개별 문자로 나누고, 인접한 토큰 쌍을 병합함.
-
가중치 로딩 (300바이트)
- 신경망의 가중치를 디스크에서 로드함.
- 가중치는 32비트 부동소수점으로 직렬화되어 있음.
-
바이트 쌍 인코딩 로딩 (300바이트)
- 바이트 쌍 인코딩 어휘를 디스크에서 로드함.
- 파일 형식은 바이트 쌍 인코딩 목록으로 구성됨.
-
-
결론
- 기계 학습의 수십 년의 발전을 몇 천 바이트로 압축할 수 있음.
- 단순한 신경망의 예시로, 실제 모델 가중치를 제외하고는 모든 것을 포함함.
Hacker News 의견
-
GPT-2를 사용해 친구와 대화를 시뮬레이션했을 때 재미있고 때로는 놀라울 정도로 정확했음. GPT-2와 GPT-3 사이의 큰 도약은 더 큰 모델, 더 많은 데이터, 또는 둘 다 때문인지 궁금함. RLHF가 큰 차이를 만들지만 기본 GPT-3 모델도 충분한 예시가 주어지면 매우 유용했음
-
간단한 신경망이 실제로 얼마나 간단한지를 보여주는 좋은 예시임. 인공지능은 우리가 돈을 벌기 위해 사용하는 검은 마법임
-
코드를 실행해보진 않았지만 작은 크기에 감명받았음. 초기 ELISA 프로그램은 더 컸음. 지난 4년 동안 이것을 바이트 단위로 맞출 수 있게 되었음. 마법이 어디에 있는지 힌트가 있다면 설명해주길 바람. GELU 함수인지 bash 스크립트를 통해 다운로드된 모델인지 궁금함
-
GPT-2가 내가 좋아하는 동화를 작성했음. 링크: The Princess, the Fairy Godmother, and the Chest
-
GPT-2가 실제로 채팅에 사용될 수 있도록 조정되었는지 궁금함. 그렇지 않다면 이것을 ChatGPT 클론이라고 부르는 것은 무리라고 생각함
-
LISP가 항상 C보다 나은 것은 아님. 이번에는 허용됨. 코드 링크를 놓쳤다면 여기 있음: C-Chat-GPT-2
-
어떤 하드웨어에서 실행될 수 있는지 궁금함. huggingface의 양자화된 가중치를 사용할 수 있는지, 어떤 문제나 쿼리에 특히 잘 맞는지 궁금함
-
요즘 gptscript를 사용하여 쉽게 자신만의 ChatGPT를 구현할 수 있음. 링크: gptscript
-
C 매크로가 정규 표현식과 어떻게 비슷한지 이해하지 못하겠음. C 매크로는 단어를 매칭하고 다른 텍스트로 대체함. 정규 표현식은 상대적으로 복잡한 패턴으로 텍스트를 매칭하며, 자체적으로 텍스트 대체를 하지 않음
-
로컬에서 실행하여 이 GP2가 생성하는 출력이 어떤지 확인한 사람이 있는지 궁금함