이 프로젝트는 대규모 모델에 대한 지식을 빠르게 학습하는 데 사용할 수 있는 소수의 매개변수를 사용하여 대규모 중국어 모델을 구축하는 것을 목표로 합니다. 이 프로젝트가 도움이 된다면 시작을 클릭하세요. 감사합니다.
모델 아키텍처: 전체 모델 아키텍처는 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 단어 분할기를 구축하는 방법에는 두 가지가 있습니다. 하나는 단어 목록을 직접 구성하고 단어 분할기를 훈련시키는 것이고, 다른 하나는 오픈 소스 모델로 훈련된 단어 분할기를 선택하는 것입니다.
편의상, 본 프로젝트에서는 학습된 모델이 작고 어휘 크기가 모델의 크기에 영향을 미친다는 점을 고려하면 어휘가 더 작은 오픈소스 프로젝트를 선호합니다. 최종적으로 선택된 테이블은 워드테이블의 크기가 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입니다.