PyTorchKR
Apple의 WWDC가 다가오며, 놀라운(!) 일들이 벌어지고 있습니다. 바로 Apple이 LLM을 공개한 것인데요, On-Device용으로 270M부터 3B까지의 작은 모델들(Small LM)을 공개했습니다. 이름부터가 A family of Open-source Efficient Language Models을 뜻하는 OpenELM으로, CoreNet을 사용하여 사전 학습을 했다고 합니다. 함께 살펴보시죠.
Apple, 스마트폰에서 동작하는 270M ~ 3B 규모의 작은 언어모델 OpenELM 패밀리 공개
소개
애플이 새롭게 발표한 OpenELM은 Hugging Face Hub를 통해 접근 가능한 오픈 소스 LLM입니다. 이 모델은 디바이스 내에서 동작하기 때문에 클라우드 기반 모델과 비교할 때 개인정보 보호가 강화되며, 연결이 불안정한 환경에서도 AI 기능을 사용할 수 있는 장점이 있습니다. 또한, 이 모델은 연구자들에게 더 많은 실험과 개선의 기회를 제공하며, 오픈 소스라는 점에서 개발자들이 자유롭게 사용하고 수정할 수 있습니다.
OpenELM은 기존의 클라우드 기반 대규모 언어 모델들과 크게 비교됩니다. 클라우드 기반 모델들은 강력한 처리 능력을 제공하지만, 개인정보 보호와 연속성 측면에서 취약점을 가질 수 있습니다. 반면, OpenELM은 디바이스 내 실행이 가능하여 이러한 문제들을 해결하고, 개발자가 보다 자유롭게 AI를 사용하고 개선할 수 있는 기회를 제공합니다.
주요 특징
OpenELM 모델은 CoreNet 라이브러리를 사용해 사전 훈련된 네 가지 모델과 네 가지 지시어 조정 모델을 포함하고 있습니다. 이 모델들은 각 변환기 모델의 레이어 내에서 효율적으로 파라미터를 할당하는 레이어별 스케일링 전략을 사용하여 정확도를 향상시킵니다. 예를 들어, 약 1B 파라미터 예산을 가진 OpenELM은 OLMo와 비교하여 2.36%의 정확도 향상을 보였으며, 사전 훈련 토큰 수도 2배 적게 요구합니다.
모델 성능 비교
Zero-Shot
Model Size | ARC-c | ARC-e | BoolQ | HellaSwag | PIQA | SciQ | WinoGrande | Average |
---|---|---|---|---|---|---|---|---|
OpenELM-270M | 26.45 | 45.08 | 53.98 | 46.71 | 69.75 | 84.70 | 53.91 | 54.37 |
OpenELM-270M-Instruct | 30.55 | 46.68 | 48.56 | 52.07 | 70.78 | 84.40 | 52.72 | 55.11 |
OpenELM-450M | 27.56 | 48.06 | 55.78 | 53.97 | 72.31 | 87.20 | 58.01 | 57.56 |
OpenELM-450M-Instruct | 30.38 | 50.00 | 60.37 | 59.34 | 72.63 | 88.00 | 58.96 | 59.95 |
OpenELM-1_1B | 32.34 | 55.43 | 63.58 | 64.81 | 75.57 | 90.60 | 61.72 | 63.44 |
OpenELM-1_1B-Instruct | 37.97 | 52.23 | 70.00 | 71.20 | 75.03 | 89.30 | 62.75 | 65.50 |
OpenELM-3B | 35.58 | 59.89 | 67.40 | 72.44 | 78.24 | 92.70 | 65.51 | 67.39 |
OpenELM-3B-Instruct | 39.42 | 61.74 | 68.17 | 76.36 | 79.00 | 92.50 | 66.85 | 69.15 |
LLM360
Model Size | ARC-c | HellaSwag | MMLU | TruthfulQA | WinoGrande | Average |
---|---|---|---|---|---|---|
OpenELM-270M | 27.65 | 47.15 | 25.72 | 39.24 | 53.83 | 38.72 |
OpenELM-270M-Instruct | 32.51 | 51.58 | 26.70 | 38.72 | 53.20 | 40.54 |
OpenELM-450M | 30.20 | 53.86 | 26.01 | 40.18 | 57.22 | 41.50 |
OpenELM-450M-Instruct | 33.53 | 59.31 | 25.41 | 40.48 | 58.33 | 43.41 |
OpenELM-1_1B | 36.69 | 65.71 | 27.05 | 36.98 | 63.22 | 45.93 |
OpenELM-1_1B-Instruct | 41.55 | 71.83 | 25.65 | 45.95 | 64.72 | 49.94 |
OpenELM-3B | 42.24 | 73.28 | 26.76 | 34.98 | 67.25 | 48.90 |
OpenELM-3B-Instruct | 47.70 | 76.87 | 24.80 | 38.76 | 67.96 | 51.22 |
OpenLLM Leaderboard
Model Size | ARC-c | CrowS-Pairs | HellaSwag | MMLU | PIQA | RACE | TruthfulQA | WinoGrande | Average |
---|---|---|---|---|---|---|---|---|---|
OpenELM-270M | 27.65 | 66.79 | 47.15 | 25.72 | 69.75 | 30.91 | 39.24 | 53.83 | 45.13 |
OpenELM-270M-Instruct | 32.51 | 66.01 | 51.58 | 26.70 | 70.78 | 33.78 | 38.72 | 53.20 | 46.66 |
OpenELM-450M | 30.20 | 68.63 | 53.86 | 26.01 | 72.31 | 33.11 | 40.18 | 57.22 | 47.69 |
OpenELM-450M-Instruct | 33.53 | 67.44 | 59.31 | 25.41 | 72.63 | 36.84 | 40.48 | 58.33 | 49.25 |
OpenELM-1_1B | 36.69 | 71.74 | 65.71 | 27.05 | 75.57 | 36.46 | 36.98 | 63.22 | 51.68 |
OpenELM-1_1B-Instruct | 41.55 | 71.02 | 71.83 | 25.65 | 75.03 | 39.43 | 45.95 | 64.72 | 54.40 |
OpenELM-3B | 42.24 | 73.29 | 73.28 | 26.76 | 78.24 | 38.76 | 34.98 | 67.25 | 54.35 |
OpenELM-3B-Instruct |
사용 방법
Hugging Face의 transformer를 설치한 뒤, 사용하려는 OpenELM 모델을 불러옵니다. 예를 들어, 다음은 270M 파라미터를 가진 모델을 사용하는 코드입니다.
from transformers import AutoModelForCausalLM
# 270M 파라미터 모델 불러오기
openelm_270m = AutoModelForCausalLM.from_pretrained("apple/OpenELM-270M", trust_remote_code=True)
모델을 불러온 후, 간단한 텍스트 생성을 위한 스크립트를 실행할 수 있습니다. 아래의 예시는 OpenELM모델을 사용하여 텍스트를 생성하는 방법을 보여줍니다.
# generate_openelm.py 파일을 생성 후 아래 코드를 작성
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
def generate_text(model_name, prompt):
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, trust_remote_code=True)
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**inputs, max_length=50)
return tokenizer.decode(outputs[0], skip_special_tokens=True)
# 사용 예
print(generate_text("apple/OpenELM-270M", "Once upon a time there was"))
이 스크립트는 주어진 prompt
로 시작하는 이야기를 생성합니다. generate_text
함수는 토크나이저를 사용하여 입력 텍스트를 모델에 맞는 형식으로 변환하고, generate
메서드를 호출하여 텍스트를 생성한 후, 생성된 텍스트를 디코딩합니다.
그 외에도 모델의 생성 기능을 조정하기 위해 여러 추가 인수(generate_kwargs
)를 전달할 수 있습니다. 예를 들어, 반복적인 텍스트의 생성을 방지하기 위한 repetition_penalty
를 설정할 수 있습니다. 또한, prompt_lookup_num_tokens
같은 인수를 통해 토큰 예측 시 성능을 향상시킬 수 있습니다.
# 고급 설정 예제
print(generate_text("apple/OpenELM-270M", "Once upon a time there was", repetition_penalty=1.2, prompt_lookup_num_tokens=10))
더 읽어보기
기사
OpenELM 기술 문서
OpenELM-270M
OpenELM-450M
OpenELM-1_1B
OpenELM-3B
OpenELM-270M-Instruct
OpenELM-450M-Instruct
OpenELM-1_1B-Instruct
OpenELM-3B-Instruct
학습용 라이브러리 CoreNet의 GitHub 저장소
이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다.
파이토치 한국 사용자 모임이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)
아래쪽에 좋아요를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~