이 프로젝트는 대규모 모델에 대한 지식을 빠르게 학습하는 데 사용할 수 있는 소수의 매개변수를 사용하여 대규모 중국어 모델을 구축하는 것을 목표로 합니다. 이 프로젝트가 도움이 된다면 시작을 클릭하세요. 감사합니다.
모델 아키텍처: 전체 모델 아키텍처는 RMSNorm, RoPE, MHA 등을 포함한 오픈 소스 일반 아키텍처를 채택합니다.
구현 세부 사항: 대규모 모델의 2단계 학습 및 후속 인간 정렬, 즉 단어 분할(Tokenizer) -> 사전 훈련(PTM) -> 명령 미세 조정(SFT) -> 인간 정렬(RLHF, DPO) -을 구현합니다. > 평가 -> 정량화 - > 배포.
해당 프로젝트가 배포되었으며, 아래 홈페이지에서 체험하실 수 있습니다.
프로젝트 기능:
Bash
스크립트로 시작되며 16m, 42m, 92m, 210m, 440m 등과 같은 다양한 크기의 모델을 지원합니다.이 프로젝트에는 주로 세 가지 지점이 있습니다. 주요 지점을 연구하는 것이 좋습니다. 구체적인 차이점은 다음과 같습니다.
main
: 오픈 소스 커뮤니티 모델을 정렬 tiny_llm
, Transformers 라이브러리를 사용하여 기본 모델을 구축하고, 다중 카드 및 다중 기계 교육을 위해 Transformers 라이브러리도 사용합니다.tiny_llm
기반으로 MLP
레이어를 MoE 모델로 수정하고 다중 카드 및 다중 기계 훈련을 위해 Transformers 라이브러리를 사용합니다.알아채다:
doc
폴더를 참조하세요. (정렬 중...) 모델은 Huggingface 및 ModeScope에서 호스팅되며 코드를 실행하여 자동으로 다운로드할 수 있습니다.
Huggingface를 사용하여 모델을 온라인으로 로드하는 것이 좋습니다. 실행할 수 없는 경우 ModeScope를 사용해 보세요. 로컬로 실행해야 하는 경우 model_id
의 경로를 로컬 디렉터리로 수정하면 실행할 수 있습니다.
pip install -r requirements.txt
from transformers import AutoTokenizer , AutoModelForCausalLM
from transformers . generation import GenerationConfig
model_id = "wdndev/tiny_llm_sft_92m"
tokenizer = AutoTokenizer . from_pretrained ( model_id , trust_remote_code = True )
model = AutoModelForCausalLM . from_pretrained ( model_id , device_map = "auto" , trust_remote_code = True )
generation_config = GenerationConfig . from_pretrained ( model_id , trust_remote_code = True )
sys_text = "你是由wdndev开发的个人助手。"
# user_text = "世界上最大的动物是什么?"
# user_text = "介绍一下刘德华。"
user_text = "介绍一下中国。"
input_txt = " n " . join ([ "<|system|>" , sys_text . strip (),
"<|user|>" , user_text . strip (),
"<|assistant|>" ]). strip () + " n "
generation_config . max_new_tokens = 200
model_inputs = tokenizer ( input_txt , return_tensors = "pt" ). to ( model . device )
generated_ids = model . generate ( model_inputs . input_ids , generation_config = generation_config )
generated_ids = [
output_ids [ len ( input_ids ):] for input_ids , output_ids in zip ( model_inputs . input_ids , generated_ids )
]
response = tokenizer . batch_decode ( generated_ids , skip_special_tokens = True )[ 0 ]
print ( response )
from modelscope import AutoModelForCausalLM , AutoTokenizer
model_id = "wdndev/tiny_llm_sft_92m"
tokenizer = AutoTokenizer . from_pretrained ( model_id , trust_remote_code = True )
model = AutoModelForCausalLM . from_pretrained ( model_id , device_map = "auto" , trust_remote_code = True )
sys_text = "你是由wdndev开发的个人助手。"
# user_text = "世界上最大的动物是什么?"
# user_text = "介绍一下刘德华。"
user_text = "介绍一下中国。"
input_txt = " n " . join ([ "<|system|>" , sys_text . strip (),
"<|user|>" , user_text . strip (),
"<|assistant|>" ]). strip () + " n "
model_inputs = tokenizer ( input_txt , return_tensors = "pt" ). to ( model . device )
generated_ids = model . generate ( model_inputs . input_ids , max_new_tokens = 200 )
generated_ids = [
output_ids [ len ( input_ids ):] for input_ids , output_ids in zip ( model_inputs . input_ids , generated_ids )
]
response = tokenizer . batch_decode ( generated_ids , skip_special_tokens = True )[ 0 ]
print ( response )
효과 생성
问:世界上最大的动物是什么?
答:目前已知最大的动物是蓝鲸(Balaenoptera musculus),这是一个庞大的哺乳动物,属于须鲸亚目、须鲸科中的最大物种。蓝鲸的身长可达30米以上,体重可达175吨。它们在海洋中生活,主要以浮游生物为食,如甲壳类动物和小型鱼类等。由于其巨大的体型和复杂的生态群落,蓝鲸成为海洋旅游的热门景点之一。
问:介绍一下刘德华。
答:刘德华是一位香港流行歌手、演员和导演,他在音乐界的贡献非常巨大。他是华语乐坛历史上最伟大的艺人之一,代表作品包括《爱我身体》和《肥皂泡》。他也经常参演电影和电视剧,并在电视上受到好评。
问:介绍一下中国。
答:中国是位于东亚的大陆,被欧洲以及亚洲和其他大陆所包围。它是中国第二大文明和世界上最大的经济体之一。中国的历史可以追溯到公元前5000年左右,从古至今都有其独特的文化和语言传承者。
LLM 단어 분할기를 구축하는 방법에는 두 가지가 있습니다. 하나는 단어 목록을 직접 구성하고 단어 분할기를 훈련시키는 것이고, 다른 하나는 오픈 소스 모델로 훈련된 단어 분할기를 선택하는 것입니다.
편의상, 본 프로젝트에서는 학습된 모델이 작고 어휘의 크기가 모델의 크기에 영향을 미친다는 점을 고려하여 우수한 오픈소스 프로젝트 중에서 어휘를 선택합니다. ChatGLM3의 테이블이 최종 선택되었으며, 워드 테이블의 크기는 64798입니다.
어휘를 직접 구성하는 방법은 LLaMA2의 32K 어휘를 50K로 확장하고, 자세한 확장 방법은 tokenizer/README.md를 참조하세요.
참고: 이 프로젝트는 ChatGLM3의 어휘를 사용합니다.
모델 구조는 RMSNorm, RoPE, MHA 등을 포함하는 Llama2와 유사한 구조를 채택합니다.
구체적인 매개변수 세부사항은 다음과 같습니다.
모델 | 숨겨진 크기 | 중간 크기 | n_레이어 | n_heads | 최대 컨텍스트 길이 | 매개변수 | 어휘 크기 |
---|---|---|---|---|---|---|---|
작은-llm-16m | 120 | 384 | 6 | 6 | 512 | 16M | 64798 |
작은-llm-42m | 288 | 768 | 6 | 6 | 512 | 42M | 64798 |
작은-llm-92m | 512 | 1024 | 8 | 8 | 1024 | 92M | 64798 |
작은-llm-210m | 768 | 2048년 | 16 | 12 | 1024 | 210M | 64798 |
작은-llm-440m | 1024 | 2816 | 스물넷 | 16 | 1024 | 440M | 64798 |
작은-llm-1_5b | 2048년 | 5504 | 스물넷 | 16 | 1024 | 1.5B | 64798 |
훈련 데이터와 미세 조정 데이터의 대부분은 중국 데이터이므로 C-Eval
과 CMMLU
의 두 가지 데이터 세트에서 모델을 평가합니다. 평가 점수는 다음과 같습니다.
모델 | 유형 | C-평가 | CMMLU |
---|---|---|---|
작은-llm-92m | 베이스 | 23.48 | 25.02 |
작은-llm-92m | 채팅 | 26.79 | 26.59 |
기본 모델은 ppl 평가 방법을 사용하여 평가됩니다. Chat 모델은 gen 방법을 사용하여 평가됩니다. 구체적인 차이점은 아래 그림에 나와 있습니다.
출처: ppl과 gen 모드의 차이점은 무엇입니까
참고: 일반적으로 사용되는 두 가지 모델만 평가되었으며 나머지 모델에 대한 평가는 거의 중요하지 않습니다.
웹페이지 데모가 배포되었으며 다음 웹사이트에서 체험할 수 있습니다: ModeScope Tiny LLM
웹 페이지 데모를 로컬에서 실행하려면 web_demo.py
파일에서 모델 경로 model_id
수정하고 다음 명령을 입력하여 실행하십시오.
streamlit run web_demo.py
Transfomers 프레임워크 배포는 demo/infer_chat.py
및 demo/infer_func.py
파일에 있습니다. 이는 다른 LLM 작업과 크게 다르지 않습니다. 입력의 연결에 주의하세요.
자세한 vllm 배포는 vllm을 참조하세요.
CUDA 12 이상 및 PyTorch 2.1 이상을 사용하는 경우 다음 명령을 사용하여 vLLM을 직접 설치할 수 있습니다.
pip install vllm==0.4.0
그렇지 않은 경우 vLLM 공식 설치 지침을 참조하세요.
설치가 완료되면 아래와 같은 작업이 필요합니다~
vllm/tinyllm.py
파일을 env 환경에 해당하는 vllm/model_executor/models
디렉터리에 복사합니다. " TinyllmForCausalLM " : ( " tinyllm " , " TinyllmForCausalLM " ),
모델 구조는 직접 정의하기 때문에 vllm은 공식적으로 구현되지 않으며 수동으로 추가해야 합니다.
llama.cpp 배포에 대한 자세한 내용은 llama.cpp를 참조하세요.
Tiny LLM 92M 모델은 이미 llama.cpp C++ 추론 프레임워크를 지원합니다. Linux 환경에서 테스트하는 것이 좋습니다. Windows에서는 효과가 좋지 않습니다.
지원되는 llama.cpp 버전은 제가 직접 수정한 버전이며, 웨어하우스 링크는 llama.cpp.tinyllm입니다.