최근에 일 때문에 ChatGLM-6B를 접하게 되었고 몇 가지 테스트를 직접 배포했습니다.
나는 인터넷에서 많은 훌륭한 자료를 참조하고 이를 바탕으로 내 자신의 연습에서 찾은 세부 사항을 추가합니다.
대부분의 배포 콘텐츠 출처: https://zhuanlan.zhihu.com/p/627168140
미세 조정 참조: https://zhuanlan.zhihu.com/p/625468667
세부 정보 참조: https://zhuanlan. zhihu.com/p/624918286
공유해 주신 작가님 덕분에 최고 추천! !
약간의 지식 리터러시(초심자로서 학습 과정에서 이해해야 하는 대부분의 기본 지식은 이유가 아닌 방법에 대해 언급될 것이라고 생각합니다. 일부 단편적이고 비체계적입니다. 양해 바랍니다.)
사전 훈련된 모델의 특징:
훈련을 위해 큰 데이터 세트를 사용하여 이미 얕은 기본 기능과 깊은 추상 기능을 추출하는 기능이 있습니다.
큰 모델의 핵심(컨볼루션 신경망):
1) 얕은 컨볼루션 레이어는 기본 기능을 추출합니다: 에지 및 기본 기능과 같은 기본 기능
2) 깊은 컨볼루션 레이어는 전체 얼굴 모양과 같은 추상적인 특징을 추출합니다.
3) 완전 연결 레이어는 특징의 조합을 기반으로 스코어링 및 평가를 수행합니다 .
미세 조정을 수행하는 이유:
처음부터 학습하는 것과 비교할 때 문제가 발생할 수 있습니다:
1. 많은 데이터, 컴퓨팅 시간 및 컴퓨팅 리소스가 필요합니다.
2. 학습 후 모델이 수렴되지 않고 매개 변수가 충분히 최적화되지 않으며 정확도가 낮습니다 모델 일반화가 낮고 과적합하기
쉽습니다
. 원래 모델의 기능
미세 조정을 사용해야 하는 경우
1. 사용할 데이터셋은 선훈련된 데이터셋과 유사하며, 너무 유사하지 않으면 효과가 그다지 좋지 않습니다. 데이터 추출 기능이 다르기 때문에 얼굴 인식을 직접 해야 합니다. 따라서 해당 매개 변수가 상당히 다르므로 미세 조정이 효과적이지 않습니다.)
2. 자신이 구축하거나 사용하는 모델의 정확도가 너무 낮습니다. , 스스로 수집할 수 있는 데이터 셋이 너무 적거나 컴퓨팅 리소스가 부족하여
미세 조정 실습에서 적은 데이터로 학습(역전파)하는 경우가 많습니다.
RLHF 교육 과정
1. SFT(Supervised Fine-Tuning): 다양한 질의(query), 감독된 미세 조정, 데이터 형식: [{"prompt":"xxxxx" ," 답변":"yyyyyy"},{"프롬프트":"xxxxx","답변":"yyyyyy"},...]
2.RM(Reward Model): 독립적인(보통 SFT보다 작음) 보상 모델(RW)을 훈련하기 위해 동일한 쿼리(query)에 대해 사람이 채점한 여러 답변을 포함하는 데이터 세트를 사용하는 보상 모델(RW), 데이터 형식: 1개의 동일한 질문 , 여러 답변 세트
[
{"prompt":"xxxxx", "answer":"yyyyyy1",score:-1.0}
{"prompt":"xxxxx", "answer":"yyyyyy2",score :5.0}
{ "프롬프트":"xxxxx","대답":"yyyyyy3",점수:8.0}
...
]
3. RL(강화 학습): RW 모델의 보상 피드백에 따라 SFT 모델을 더욱 미세 조정하기 위해 PPO(Proximal Policy Optimization) 알고리즘을 사용하는 강화 학습입니다.
데이터 형식: Q&A는 SFT 참조 와 유사합니다.
1단계: 지도 미세 조정(SFT)
2단계: 보상 모델 미세 조정
3단계: 인공 피드백 강화 학습(RLHF)
DeepSpeed 채팅 교육 세부 정보
미세 조정 데이터의 예
{
"instruction": "你现在是一个很厉害的阅读理解器,找到句子中的三元组信息并输出成json给我。",
"input": "九玄珠是在纵横中文网连载的一部小说,作者是龙马。",
"target": "```json\n[{
\"predicate\": \"连载网站\", \"object_type\": \"网站\", \"subject_type\": \"网络小说\", \"object\": \"纵横中文网\", \"subject\": \"九玄珠\"}, {
\"predicate\": \"作者\", \"object_type\": \"人物\", \"subject_type\": \"图书作品\", \"object\": \"龙马\", \"subject\": \"九玄珠\"}]\n```"
}
{
"prompt": "Instruction: 你现在是一个很厉害的阅读理解器,找到句子中的三元组信息并输出成json给我:。\nInput: 九玄珠是在纵横中文网连载的一部小说,作者是龙马。\nAnswer: ",
"answer": "```json\n[{
\"predicate\": \"连载网站\", \"object_type\": \"网站\", \"subject_type\": \"网络小说\", \"object\": \"纵横中文网\", \"subject\": \"九玄珠\"}, {
\"predicate\": \"作者\", \"object_type\": \"人物\", \"subject_type\": \"图书作品\", \"object\": \"龙马\", \"subject\": \"九玄珠\"}]\n```"
}
Instruction: 모델이 수행할 작업의 명령 저장
Input: 모델에 입력한 작업 데이터 저장
Target: 모델의 출력 레이블 저장
질문과 답변 형식으로 Instruction과 Input이 통합됨
미세 조정 프로세스에 대한 몇 가지 고려 사항
1. 일반적으로 미세 조정 프로세스는 사전 학습 모델의 처음 몇 계층을 동결하고 네트워크의 마지막 계층만 조정합니다. 미세 조정 데이터 세트가 충분히 크면 조정된 네트워크 계층의 수가 조정됩니다. 2. 더 작은 학습률을 사용하여
네트워크를 훈련합니다. 일반적인 방법은 처음부터 훈련의 초기 학습률보다 10배 낮은 초기 학습률을 미세 조정하는 것입니다. ChatGLM에 관한 한 일부 사람들은 lr(learning_rate learning rate) = 2e-5 이하 3. 작은 샘플(100개
) 미세 조정을 사용하는 것이 좋습니다. 피팅 작업 요구 사항을 안정화하기 위해 num_train_epochs(최대 반복 횟수) = 20을 권장합니다.
Baidu Wenxin Qianfan 권장 사항: 100 데이터, Epoch는 15, 1000 데이터, Epoch는 10, 10000 데이터, Epoch는 2입니다.
2. 미세 조정 데이터 세트는 얼마나 커야 합니까 인터넷에서 많이 읽었는데 모두 선택의 수가 특정 상황에 따라 다르다고 합니다(사실이지만 도움이 되지 않습니다). 몇 가지 구체적인 제안: 1
) 사전 교육 및 미세 조정 작업의 데이터 분포가 일치하는지 여부, 분포가 일치하면 100이면 충분하고 분포가 다르면 더 많은 데이터가 필요하며 1000 이상 또는 10,000이 더 좋습니다
. 너무 많아야 합니다(예: 수백 개). 그렇지 않으면 잠재적으로 과적합 문제가 발생하고 모델 성능에 영향을 미칠 수 있습니다. 동시에 서로 다른 작업의 비율이 균형을 이루어야 하며 전체 데이터 세트의 용량(일반적으로 수천 또는 수만 개)을 제한하여 더 큰 데이터 세트가 전체 분포를 압도하지 않도록 해야 합니다.
요약하면 미세 조정 훈련 세트의 단일 작업은 수백 개면 충분하며 전체 샘플 수는 수만 개를 초과하지 않아야 합니다.
3. 미세 조정이 적합하지 않은 것들
미세 조정을 통해 새로운 지식이 주입되는 것을 기대하지 않는 것이 가장 좋습니다. 도메인 지식 주입을 목적으로 SFT를 통해 미세 조정을 수행하여 모델을 "바보"로 만들기 쉽습니다.
데이터세트 분류
훈련셋, 검증셋, 테스트셋으로 구분
데이터의 양이 많지 않은 경우(10,000레벨 이하) 훈련셋, 검증셋, 테스트셋을 6:2:2로 나누고 데이터가 큰 경우 , 훈련셋, 검증셋, 테스트셋의 비율을 98:1:1로 조정하되 데이터가 적은 경우에는 사각형을 따로 두거나 K-fold 등 일부 고급 방법을 사용할 수도 있습니다. 교차 검증 등
입력 데이터가 무한히 길 수 있습니까?
다음은 그룹의 Su Shen(RoPE 저자)의 답변입니다.
限制在训练数据。理论上rope的llama可以处理无限长度,但问题是太长了效果不好啊,没训练过的长度效果通常不好。而想办法让没训练过的长度效果好,这个问题就叫做“长度外推性”问题。
그래서 2k의 길이 제한을 받아들입니다. 길이가 길수록 교육 리소스가 더 오래 점유되고 시간이 길어집니다. ChatGLM의 최대 제한은 2048입니다. 최신 ChatGLM2는 이미 32K를 지원합니다. 정말 그렇습니다
. 엄청난! !
초장문의 입력을 지원해야 한다면 문제 해결을 위해 LangChain + ChatGLM-6B를 고려할 수 있습니다
. 그러나 인터넷에는 ChatGLM-6B + LangChain 연습 의 예가 있습니다 .
일부 용어 설명
RLHF: 인간 피드백을 통한 강화 학습
LoRA: 사전 훈련된 모델 가중치를 고정하고 트랜스포머 아키텍처의 각 계층에 병렬로 훈련 가능한 순위 분해 행렬을 주입하여 다운스트림 작업의 신뢰성을 크게 줄이는 저순위 적응(미세 조정 모델을 위한 체계). 훈련 매개변수의 수. 미세 조정은 일종의 LoRA입니다.
anaconda3: 충돌을 피하기 위해 여러 AI 런타임 환경을 로컬로 배포하기 위한 가상 환경 관리 도구
ChatGLM-6B 배포
소스 코드 다운로드
git clone https://github.com/THUDM/ChatGLM-6B
자식 소스 속도 향상
여기서 막힐 수 있습니다. 사전에 명령줄에서 git 학술 리소스 가속을 설정할 수 있습니다.
다음 2개의 명령을 실행하여 git 학술 리소스 가속을 설정합니다.
git config --global http.proxy socks5h://172.16.16.39:8443
git config --global https.proxy socks5h://172.16.16.39:8443
다음 단계에서 git clone 명령을 실행하면 중단되지 않습니다.
git 학술 가속을 취소하는 방법도 간단합니다. 다음 명령을 실행하면(모든 단계 실행 후 취소~)
git 학술 리소스 가속을 취소할 수 있습니다.
git config --global --unset https.proxy
git config --global --unset http.proxy
종속성 설치
그 중 트랜스포머 라이브러리 버전은 4.27.1을 추천하지만 이론적으로 4.23.1 이상은 아니다.
cd ChatGLM-6B
pip install -r requirements.txt
다운로드 모델
여기에 다운로드한 모델 파일을 로컬 chatglm-6b 디렉토리에 넣습니다.
git clone https://huggingface.co/THUDM/chatglm-6b /mnt/workspace/chatglm-6b(目录可以调整为自己本地的目录)
매개변수 조정
모델의 기본 다운로드 주소가 이전에 변경되었으므로 로컬 모델을 로드하고 web_demo.py, cli_demo.py, api.py 파일을 각각 수정하려면 여기에서 경로 매개 변수를 변경해야 합니다 (ChatGLM-6B 아래).
tokenizer = AutoTokenizer.from_pretrained("/mnt/workspace/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("/mnt/workspace/chatglm-6b", trust_remote_code=True).half().cuda()
.
공용 네트워크에 노출하려면 web_demo.py 파일을 수정해야 합니다.
demo.queue().launch(share=True, inbrowser=True, server_name='0.0.0.0', server_port=7860)
웹 모드 시작
pip install gradio
python web_demo.py
API 모드 시작
pip install fastapi uvicorn
python api.py
테스트 명령
curl -X POST "http://127.0.0.1:8000" -H 'Content-Type: application/json' -d '{"prompt": "你好", "history": []}'
명령줄 모드 시작
python cli_demo.py
위는 FP16(양자화 없음) 정밀도이며 INT8 및 INT4 정밀도의 양자화 로드 방법은 Github README를 참조할 수 있습니다.
P-Tuning 기반 미세 조정 ChatGLM-6B
W&B 비활성화
W&B를 비활성화합니다. 비활성화하지 않으면 미세 조정 교육이 중단될 수 있습니다. 만일을 대비하여 비활성화해야 합니다.
Transformers 버전 4.12.5에서 사용하는 환경 변수는 버전 5.x에서 더 이상 사용되지 않습니다.
export WANDB_DISABLED=true
#### 准备数据集
格式:json key值可以自定义,多条数据直接换行,而不是组成json数组
```bash
{
"content": "类型#上衣*版型#宽松*版型#显瘦*图案#线条*衣样式#衬衫*衣袖型#泡泡袖*衣款式#抽绳",
"summary": "这件衬衫的款式非常的宽松,利落的线条可以很好的隐藏身材上的小缺点,穿在身上有着很好的显瘦效果。领口装饰了一个可爱的抽绳,漂亮的绳结展现出了十足的个性,配合时尚的泡泡袖型,尽显女性甜美可爱的气息。"
}
위에서 언급한 훈련 세트, 검증 세트, 테스트 세트 이렇게 3개의 데이터 세트를 준비해야 하는데, 샘플은 반복할 수 없고, 비율은 위에서 언급한 대로 될 수 있습니다
. . .
train.sh의 train_file, validation_file 및 test_file을 수정하고 자신의 JSON 형식 데이터 세트 경로로 evaluate.sh를 수정하고 prompt_column 및 response_column을 JSON 파일의 입력 텍스트 및 출력 텍스트에 해당하는 KEY로 변경합니다. 자체 데이터 세트의 최대 입력 및 출력 길이와 일치하도록 max_source_length 및 max_target_length를 늘려야 할 수도 있습니다.
P-Tuning-v2 방법은 모든 모델 매개변수를 고정하고 quantization_bit를 조정하여 원본 모델의 양자화 수준을 조정할 수 있습니다. 이 옵션을 추가하지 않으면 FP16 정밀도로 로드됩니다. 훈련에 실패할 경우 다시 다운로드해야 하도록 훈련 전에 사전 훈련된 원본 모델을 백업하십시오.
구체적인 설치 및 교육 과정은 공식 문서를 직접 참조할 수 있습니다: https://github.com/THUDM/ChatGLM-6B/tree/main/ptuning