안녕하세요 Simon입니다.
오늘 소개해드릴 논문은 SOLAR 10.7B에 관한 논문입니다. 지금 FastCampus에서 Upstage의 파인튜닝 노하우 강의를 듣고 있는데 김성훈 CEO가 소개해준 내용과 연관해서 리뷰를 해보겠습니다. 강의를 수강하는데 계속 웃음꽃이 떠나질 않는 거 보면 확실히 현재 제일 hot 한 최전선에 있는 분야에서 최고가 된 만큼 얼마나 기쁠까 생각이 들긴 합니다.
LLM의 평가지표는 여러가지가 있습니다. H4는 4개의 데이터셋으로 평가한다는 의미인데요, 현재 H7 까지도 증가해서 평가를 받고 있습니다. 그말은 즉슨 H4에서의 벤치마크가 높은데 H7에서는 떨어진다? 이 말은 모델이 그만큼 일반화가 되지 않은 모델이라고 생각해 볼 수 있습니다. LLM 평가지표에 대한 글은 제가 다시한번 정리해서 포스팅 하겠습니다
https://arxiv.org/abs/2312.15166
Abstrack
"SOLAR 10.7B"는 최근 대규모 언어 모델을 효율적으로 확장하는 노력에서 영감을 받아, '깊이 확장(Depth Up-Scaling, DUS)'이라는 새로운 방법을 제시합니다. 이 방법은 깊이 방향의 확장과 지속적인 사전 훈련을 포함합니다. 다른 LLM 확장 방법들이 전문가의 혼합(mixture-of-experts)을 사용하는 것과 달리, DUS는 훈련과 추론을 효율적으로 수행하기 위한 복잡한 변경을 요구하지 않습니다.
연구자들은 실험을 통해 DUS가 작은 모델에서 고성능의 대규모 모델로 확장하는 데 있어 간단하면서도 효과적임을 보여줍니다. 또한, "SOLAR 10.7B"를 기반으로 지시사항을 따르는 능력에 특화된 변형 모델인 "SOLAR 10.7B-Instruct"를 제시하며, 이는 "Mixtral-8x7 B-Instruct"를 능가하는 성능을 보여줍니다.
-> 현재 MoE 가 나오면서 차츰 트렌드가 바뀌고 있지 않나 생각이 드는데 SOLAR는 아직 전문가 혼합방법을 사용하지 않았다는 것이 특징입니다. 워낙 리더보드에 올리는 Queue 대기시간이 길기도 하고 이전 모델을 올렸을 텐데도 순위가 항상 높은 거 보면 Upstage 모델은 탄탄하게 데이터셋을 구축해서 학습시키는 게 아닐까 생각이 듭니다. 과연 깊이 업스케일링(DUS)은 어떤 것인지 알아보겠습니다.
- Step 1 - Depthwise Scaling:
- Step1-1 - 기존의 32층 레이어를 그대로 복사합니다
- Step1-2 - 8층 레이어를 추가하고, 이를 기존의 24층과 병합하여 총 32층의 레이어가 유지됩니다.
- Step 2 - Continued Pretraining:
- 병합된 32층의 레이어를 기반으로, 추가적인 레이어를 추가하여 총 48층의 레이어로 모델을 확장합니다. 이는 모델의 성능을 향상시키기 위한 사전 훈련(pretraining) 단계의 연장입니다.
n = 32, s = 48, m = 8인 경우의 뎁스 업스케일링입니다. 깊이별 스케일링과 지속적인 사전 훈련의 2단계 프로세스를 통해 이루어집니다.
1. Introduction
최근 LLM들이 MoE 방식의 전문가 혼합과 같은 방법들로 확장되고 있는 추세인데요. 효과적으로 확장은 할 수 있지만 그에 따라 문제가 발생합니다. 훈련 및 추론 프레임워크의 변경이 필요하고 이를 통해 환경설정에서 장애를 요인 하기도 합니다. 그래서 이에 영감을 받아 깊이 확장(Depth Up-Scaling, DUs)이 라는 새로운 방법을 제시합니다. DUS는 기본 모델을 깊이 차원에서 확장하고 확장된 모델을 지속적으로 사전 훈련하는 것을 포함합니다. MoE와 달리, DUS는 추가 모듈이나 동적 요소 없이, HuggingFace와 같은 사용하기 쉬운 LLM 프레임워크와 즉시 호환되며, 훈련이나 추론 프레임워크에 변경을 필요로 하지 않습니다. 또한, DUS는 모든 트랜스포머 아키텍처에 적용 가능하여, LLM을 간단하게 효과적이고 효율적으로 확장할 수 있는 새로운 방법을 제공합니다.
2. Depth Up-Scaling
기존 모델의 사전 훈련된 가중치를 사용하여 더 큰 LLM으로 확장하는 것을 목표로 합니다.
기본 모델(Base model)
32층의 Llama 2 아키텍처를 기본 모델로 선택하고, Mistral 7B의 사전 훈련된 가중치로 초기화합니다. Llama 2 아키텍처를 선택함으로써, 커뮤니티 리소스를 활용하고 새로운 수정을 통해 그 기능을 더욱 향상시키려고 합니다.
깊이 확장(Depthwise scaling)
n층의 기본 모델에서, 확장 모델의 목표 층 수 s를 설정합니다. 이 과정은 사용 가능한 하드웨어에 의해 크게 결정됩니다. 기본 모델의 n층을 복제한 후, 원래 모델의 마지막 m층과 복제본의 처음 m층을 제거하여 두 개의 별도 모델을 형성합니다. 이 두 모델을 연결하여 s = 2·(n−m) 층의 확장 모델을 형성합니다. 예를 들어, n = 32, s = 48, m = 8로 설정하여 7억에서 13억 매개변수 사이의 효율적인 확장 모델을 만듭니다.
지속적인 사전 훈련(Continued pretraining)
깊이 확장된 모델의 성능은 초기에 기본 LLM보다 떨어집니다. 따라서, 추가적인 지속적인 사전 훈련 단계를 적용합니다. 실험적으로, 지속적인 사전 훈련 중에 확장 모델의 성능이 빠르게 회복되는 것을 관찰했습니다. 깊이 확장 방식이 확장 모델에서의 이질성을 분리하여 빠른 성능 회복을 가능하게 했다고 생각합니다.
다른 확장 방법과의 비교: 깊이 확장된 모델은 Komatsuzaki et al. (2022)와 달리 추가 모듈(예: 게이팅 네트워크 또는 동적 전문가 선택)이 필요하지 않습니다. 따라서 DUS의 확장 모델은 최적의 훈련 효율을 위한 별도의 훈련 프레임워크나 빠른 추론을 위한 특수 CUDA 커널을 필요로 하지 않습니다. DUS 모델은 기존 훈련 및 추론 프레임워크에 원활하게 통합되면서 높은 효율성을 유지할 수 있습니다.
-> CUDA 가 필요하지 않다? 아마 다른 의미의 CUDA 사용이 필요 없고 프레임워크를 통합할 수 있는 개념을 말하는 듯함
3. Training Details
지시사항 조정(Instruction Tuning):
- 이 단계에서 모델은 질문-답변(QA) 형식의 지시사항을 따르도록 훈련됩니다.
- 주로 오픈 소스 데이터셋을 사용하지만, 모델의 수학적 능력을 강화하기 위해 수학 QA 데이터셋을 합성합니다.
- 데이터셋 제작과정
- 먼저 Math 데이터 셋에서 수학 데이터를 수집합니다. 그 후 MetaMath와 유사한 과정을 사용하여 질문과 답변을 다시 표현합니다. 이렇게 재구성된 질문-답변 쌍을 QA 데이터셋으로 사용하여, 이를 'Synth. Math-Instruct'라고 부릅니다
정렬 조정(Alignment Tuning):
- 지시사항 조정 단계를 거친 모델은 인간 또는 강력한 AI(예: GPT4)의 선호도에 더 잘 맞도록 추가적으로 미세 조정됩니다.
- 이 단계에서도 주로 오픈 소스 데이터셋을 사용하지만, 'Synth. Math-Instruct' 데이터셋을 활용하여 수학 중심의 정렬 데이터셋을 합성합니다.
- 정렬 데이터 합성 과정
- 'Synth. Math-Instruct' 데이터의 재구성된 질문-답변 쌍이 모델의 수학적 능력 향상에 유용하다는 점을 활용
- 재구성된 질문에 대한 재구성된 답변이 원래 답변보다 더 나은 것으로 가정
- 재구성된 질문을 프롬프트로 사용하고, 재구성된 답변을 선택된 응답으로, 원래 답변을 거부된 응답으로 설정 후 DPO 튜플 생성
- 이렇게 생성된 튜플을 모아 'Synth. Math-Instruct' 데이터셋을 만듭니다.
이러한 훈련 과정은 모델이 지시사항을 더 잘 이해하고 따르며, 인간의 선호도와 더 잘 맞도록 하는 데 중점을 둡니다. 이는 모델의 성능을 향상시키고, 특히 수학적 능력을 강화하는 데 도움이 됨
-> 수학적 데이터셋에 대한 평가의 성능을 올리기 위한 detail 같다. GSM8K 라는 평가지표가 있기 때문에 이건 수리 추론 능력 평가를 한다. 그러나 H4에는 들어가있는지는 모르겠으나 통상적으로 제일 중요하고 많이 보는 지표로 MMLU가 있기 떄문에 57개의 Task 중의 수학이 있고, 또 LLM 자체가 수학에 대해 약하다는 평이 많기 때문에 개선하려고 노력한 것 같다.
4. Result
Experimental Details
전체 데이터 세트를 사용하지 않고 대신 세트를 하위 샘플링 , 대부분의 소스는 오픈소스이며 MetaMathQA와 같은 데이터셋트로 대체가능함.
6가지 작업에 대한 점수와 H6 점수(6가지 작업의 평균)를 함께 보고합니다 또 수십억 개의 매개변수 단위로 모델의 크기를 보고합니다. 유형은 모델의 훈련 단계를 나타냅니다. {사전 학습, 명령어 튜닝, 정렬 튜닝} 중에서 선택할 수 있습니다. SOLAR 10.7B 기반 모델은 다음과 같이 색상이 지정됩니다.
Main results
SOLAR 10.7B와 SOLAR 10.7B-Instruct 모델의 평가 결과를 다른 최고 성능 모델들과 함께 제시합니다
- SOLAR 10.7B의 성능: SOLAR 10.7B는 유사한 크기의 다른 사전 훈련된 모델들, 예를 들어 Qwen 14B와 Mistral 7B를 능가합니다. 이는 DUS가 기본 LLM을 확장하는데 효과적인 방법임을 보여줍니다.
- SOLAR 10.7B-Instruct의 성능: SOLAR 10.7B-Instruct는 비록 크기가 더 작음에도 불구하고, H6 점수에서 가장 높은 성능을 보여줍니다. 이 모델은 최근의 최고 성능을 보여주는 오픈 소스 LLM인 Mixtral 8x7B-Instruct-v0.1이나 Qwen 72B를 넘어섭니다.
- DUS의 효과: 이러한 결과들은 DUS를 사용하여 확장된 모델이 최첨단 성능을 달성할 수 있음을 나타냅니다. 특히, 이 모델들은 세밀한 조정(fine-tuning)을 거쳤을 때 뛰어난 성능을 보여줍니다.
Instruction Tuning
- SFT v1: Alpaca-GPT4 데이터셋만 사용. H6 점수 69.15.
- SFT v2: Alpaca-GPT4와 OpenOrca 데이터셋 사용. H6 점수 69.21, GSM8K 점수 상승.
- SFT v3: Alpaca-GPT4, OpenOrca, Synth. Math-Instruct 데이터셋 사용. H6 점수 70.03.
- SFT v4: Alpaca-GPT4와 Synth. Math-Instruct 데이터셋 사용. H6 점수 70.88.
- SFT v3 + v4: SFT v3와 SFT v4 병합. H6 점수 71.11.
결론: Synth. Math-Instruct 데이터셋 추가가 유익하며, 다양한 데이터셋을 사용한 모델 병합이 성능 향상에 도움이 됨.
Alignment Tuning
훈련 데이터셋에 대한 제거 연구
- DPO v1: Ultrafeedback Clean 데이터셋만 사용. H6 점수 73.06.
- DPO v2: Ultrafeedback Clean과 Synth. Math-Alignment 데이터셋 사용. H6 점수 73.42.
- DPO v1 + v2: DPO v1과 DPO v2 병합. H6 점수 73.21.
SFT 기반 모델에 대한 제거 연구
- DPO v2 (SFT v3 기반): H6 점수 73.42.
- DPO v3 (SFT v3 + v4 기반): H6 점수 73.58.
결론: Synth. Math-Alignment 데이터셋 추가가 H6 점수 향상에 유익하며, SFT 기반 모델을 사용한 DPO 적용이 성능에 영향을 미침.
5. Conclusion
SOLAR 10.7B와 그 파인튜닝된 버전인 SOLAR 10.7B-Instruct는 10.7억 매개변수를 가진 깊이 확장된(DUS) 모델로, Llama 2, Mistral 7B, Mixtral-7B-Instruct와 같은 모델들보다 뛰어난 NLP 성능을 보이며, DUS는 작은 LLM을 고성능 대규모 모델로 효율적으로 확장하는 데 효과적임을 보여줍니다.
Hugging Face
Loading the Model
Use the following Python code to load the model:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("Upstage/SOLAR-10.7B-Instruct-v1.0")
model = AutoModelForCausalLM.from_pretrained(
"Upstage/SOLAR-10.7B-Instruct-v1.0",
device_map="auto",
torch_dtype=torch.float16,
)
Conducting Single-Turn Conversation
conversation = [ {'role': 'user', 'content': 'Hello?'} ]
prompt = tokenizer.apply_chat_template(conversation, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, use_cache=True, max_length=4096)
output_text = tokenizer.decode(outputs[0])
print(output_text)
아마 10.7B 모델이라서 -> 인퍼런스 하는데 4090, 3090정도면 되지 않을까 생각한다. 국산에서 이런 좋은 모델이 나온다는게 신기하고 놀라웠다. 박찬준님 매번 이름이 보이는데 진짜 잘하시는 것 같다.. 나도 언젠간 오픈리더보드에 올라가는날이 오겠지 생각하고 이번 논문 리뷰를 마칩니다.