본문 바로가기

Apple Developer/Apple AI

맥북에서 AI 학습하기

728x90
반응형

이번 WWDC24 에서 

멋진 Apple intelligence 가 등장하는 모습을 보고 

이제 On-Device AI 시대가 오겠구나 싶었다. 

https://www.apple.com/apple-intelligence/

 

Apple Intelligence Preview

Apple Intelligence is personal intelligence for the things you do every day. Built into iPhone, iPad, and Mac with groundbreaking privacy.

www.apple.com

 

그래서 WWDC24 에서 AI 세션 몰아 보기를 시작했다.

역시나 재밌는 주제가 많았고 요즘 관심사인 LLM 에 대한 내용도 많이 있었다. 

 

https://developer.apple.com/videos/play/wwdc2024/10160/

 

Train your machine learning and AI models on Apple GPUs - WWDC24 - Videos - Apple Developer

Learn how to train your models on Apple Silicon with Metal for PyTorch, JAX and TensorFlow. Take advantage of new attention operations...

developer.apple.com

 

그중에 맥북에서 llama 를 학습시키는 내용이 있어 실습을 따라해봤다. 

 

일단 M1 맥북이라 잘 안될 것 같았지만

될때까지 해보니 성공!

 

Apple Silicon 칩에서 Pytorch 를 쓸 때 backend 를 MPS 라는 놈을 사용하면 맥북에서 GPU를 사용할 수 있다. 

M1 맥북 GPU 메모리는 9G 쯤 되는 듯 했다. 

 

import torch
import random
# torch.set_default_device('mps')
random.seed(42)
torch.manual_seed(42)

#이 부분은 계속 Out of Memory 나서 이것 저것 찾아봐서 적용함 
import os
os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1"
os.environ["PYTORCH_MPS_HIGH_WATERMARK_RATIO"] = "0.0"


from transformers import LlamaTokenizer, LlamaForCausalLM
# 영상에서 사용한 모델을 적용
model_path = 'openlm-research/open_llama_3b_v2'

tokenizer = LlamaTokenizer.from_pretrained(model_path, legacy=True)
base_model = LlamaForCausalLM.from_pretrained(
    model_path,
    torch_dtype=torch.float16
)

#로라 셋팅은 영상보다 낮춰서 적용해봤다. 
from peft import LoraConfig, PeftModel
lora_config = LoraConfig(
    # r=64,
    # lora_alpha=32,
    r=6,
    lora_alpha=8,
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
)
model = PeftModel(base_model, lora_config, adapter_name="test")

device= torch.device("mps")
model.to(device)

 

이렇게 로라 활용 학습 셋팅을 하고 

다음은 Data 준비 

 

Data 부분은 영상을 그대로 활용했다. 

 

코드를 가져올 때는 이번에 Mac에서만 사용 가능한 

Chatgpt 전용 앱을 설치 하고 

영상을 실행하고 있는 스크린샷을 가져오게 하여 

"영상 안에 있는 파이썬 코드 정리해줘" 와 같이 입력해서 가져왔다~ 아주 편함~!!

import os
import requests

file_name = "shakespeare.txt"
url = "https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt"
if not os.path.isfile(file_name):
    data = requests.get(url)
    with open(file_name, 'w') as f:
        f.write(data.text)

from transformers import TextDataset

train_dataset = TextDataset(tokenizer=tokenizer, file_path=file_name, block_size=128)[:256]


from transformers import Trainer, TrainingArguments

training_args = TrainingArguments(
    output_dir="output",
    overwrite_output_dir=True,
    num_train_epochs=10,
    per_device_train_batch_size=32,
    evaluation_strategy='no',
)

from transformers import DataCollatorForLanguageModeling

data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)

trainer = Trainer(
    model=model,
    args=training_args,
    data_collator=data_collator,
    train_dataset=train_dataset,
)

 

영상에서는 Generate 먼저 한번 하고 Train 하는데 일단 계속 실패 해서 

바로 Train을 돌려봤다. 

이런 저런 시도 끝에 OS도 beta버전으로 업데이트도 해보고 삽질...

어째든

trainer.train()

실행 하여 성공!!

활성상태보기 켜보니 GPU 거의 Full로 사용 함

 

일단 학습 돌리기 성공했으니 

회사 Mac 으로 돌려봐야겠다. 

 

내 맥북에어m1 불날듯;;

 

그리고 아직 실패한 문장 만들기 재도전 해야겠다. 

MPS에서 Attention Mask가 없다는데 뭔소리냐...;;

 

일단 코드 적어 둠

def generate_response(prompt_text, model, tokenizer, max_length=30, num_return_sequences=1):
    input_ids = tokenizer.encode(prompt_text, return_tensors="pt").to('mps')
   
    output_sequences = model.generate(
        input_ids=input_ids,
        max_length=max_length,
        num_return_sequences=num_return_sequences,
        no_repeat_ngram_size=2,
    )
   
    responses = []
    for response_id in output_sequences:
        response = tokenizer.decode(response_id, skip_special_tokens=True)
        responses.append(response)
   
    return responses

# 이 부분은 잘 안되길래 MPS에 강제로 로드 하려고 바꿔봄
# 원래는 BaseModel로도 되야 하는데 잘 안되길래 lora로 올린 model을 적용 
device= torch.device("mps")
model.to(device)
prompt_text = "Uneasy lies the head that wears a crown."
responses = generate_response(prompt_text, model, tokenizer)
for response in responses:
    print(response)
    
# 회사 Mac 에서는 생성은 됐었는데 일단 재 확인해보자;;

 

이 외에도 좋은 영상들이 많아서 따라해볼 예정임. 

https://developer.apple.com/videos/play/wwdc2024/10223

 

Explore machine learning on Apple platforms - WWDC24 - Videos - Apple Developer

Get started with an overview of machine learning frameworks on Apple platforms. Whether you're implementing your first ML model, or an ML...

developer.apple.com

 

728x90
반응형

'Apple Developer > Apple AI' 카테고리의 다른 글

CreatML 기능 살펴보기 (xcode ML 개발 tool)  (0) 2024.06.30