Post

SK네트웍스 Family AI 캠프 1기 17주차 회고

SK Networks AI Camp

Main image

Weekly 회고 - 17주차

:warning: 포스트를 읽기 전에..
이 포스트는 SK네트웍스 Family AI 캠프를 다니면서 느낀 개인적인 생각을 정리한 포스트입니다.
배운 내용이나 스킬셋에 대한 설명은 별도로 작성하지 않았기 때문에, 그에 대한 정보는 다른 포스트를 참고해주세요!

:thumbsup:Liked

SK네트웍스 Family AI 캠프 17주차 회고입니다!
이번 주는 저번에 말씀드린것과 같이 OpenAI API를 이용한 파인 튜닝을 진행하였습니다.
평소 파인 튜닝을 직접 해보고 싶었는데, 로컬 컴퓨터 성능이 좋지 않아 망설였었습니다.
하지만 OpenAI API를 이용하면 그런 제약 없이 진행할 수 있다는 점이 마음에 들었습니다!
혼자서 사용해보려고 했다면 오류와 싸우느라 진땀뺐을텐데 강사님께서 하나씩 설명해주면서 진행하니까 어렵지 않게 성공할 수 있었습니다.:grin:
직접 파인 튜닝을 해보니 생각보다 어렵지 않아서 다음 프로젝트에 도입해볼까 고민중입니다.:thinking:


:books:Learned

위에서 언급한 것처럼 이번 주는 파인 튜닝을 메인으로 진행하였습니다.:robot: openai-image

파인 튜닝(Fine-tuning)

파인 튜닝은 사전에 학습된 모델을 기반으로 새로운 데이터를 추가로 학습시켜 특정 작업에 맞게 모델을 최적화 하는 과정입니다. 일반적으로 대규모 데이터셋을 이용해 미리 학습된 언어 모델이나 이미지 모델을 특정 도메인, 문제에 맞게 조정할 때 사용합니다.

  1. 기대 효과
    • 특정 도메인 성능 향상
    • 적은 데이터로 높은 성능 낼 수 있음
    • 해당 도메인에 특화된 답변
  2. 주의할 점
    • 오버피팅(Overfitting)
    • 데이터 편향
    • 학습률 조절
    • 사전 학습 모델의 특징 보존
      1
      2
      
      사전 학습된 모델의 일반적이고 유용한 특성을 잃지 않도록 하기 위해  
      특정 레이어는 고정하고 일부 레이어만 업데이트하는 전략을 사용할 수 있음
      
  3. OpenAI API를 이용한 예시 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# 훈련 데이터를 작성하고 jsonl 파일 형식으로 저장
training_data = [
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "광역기는 배틀 필드에 나와 있는 모든 유닛을 공격 할 수 있습니다."},
        {"role": "assistant", "content": "모든 유닛을 공격합니다."}
    ]},
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "단일기는 배틀 필드에 있는 특정 유닛을 공격 할 수 있습니다."},
        {"role": "assistant", "content": "특정 유닛을 공격합니다."}
    ]},
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "네더 블레이드는 매턴 광역기와 단일기를 사용합니다."},
        {"role": "assistant", "content": "네더 블레이드는 매턴 광역기와 단일기를 사용합니다."}
    ]},
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "네더 블레이드의 광역기는 10의 피해를 줍니다."},
        {"role": "assistant", "content": "네더 블레이드의 광역기는 10의 피해를 줍니다."}
    ]},
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "네더 블레이드의 단일기는 20의 피해를 줍니다."},
        {"role": "assistant", "content": "네더 블레이드의 단일기는 20의 피해를 줍니다."}
    ]},
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "모든 유닛은 HP와 ATK(공격력)을 가지고 있다."},
        {"role": "assistant", "content": "모든 유닛은 HP와 ATK를 가지고 있습니다."}
    ]},
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "특수 효과가 붙어 있지 않는 한 HP가 0이 되면 유닛은 무덤으로 이동한다."},
        {"role": "assistant", "content": "HP가 0이 되면 유닛은 무덤으로 이동합니다."}
    ]},
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "광역기는 모든 적 유닛에게 피해를 줍니다."},
        {"role": "assistant", "content": "광역기는 모든 적 유닛에게 피해를 줍니다."}
    ]},
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "단일기는 하나의 적 유닛에게 큰 피해를 줍니다."},
        {"role": "assistant", "content": "단일기는 하나의 적 유닛에게 큰 피해를 줍니다."}
    ]},
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "아이템 카드 중 일부는 유닛을 공격 할 수 있습니다."},
        {"role": "assistant", "content": "일부 아이템 카드는 유닛을 공격할 수 있습니다."}
    ]},
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "네더 블레이드가 광역기로 줄 수 있는 데미지가 얼마야?"},
        {"role": "assistant", "content": "네더 블레이드의 광역기로 줄 수 있는 데미지는 10입니다."}
    ]},
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "네더 블레이드의 광역기 데미지가 몇인가요?"},
        {"role": "assistant", "content": "네더 블레이드의 광역기로 줄 수 있는 데미지는 10입니다."}
    ]},
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "네더 블레이드의 광역기는 몇 데미지를 주나요?"},
        {"role": "assistant", "content": "네더 블레이드의 광역기로 줄 수 있는 데미지는 10입니다."}
    ]},
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "유닛의 HP가 30일 때, 네더 블레이드가 1턴에 이 유닛을 정리할 수 있나요?"},
        {"role": "assistant", "content": "네, 네더 블레이드는 1턴에 유닛을 정리할 수 있습니다. "
                                         "네더 블레이드의 광역기는 10의 피해를 주고, 단일기는 20의 피해를 줍니다. 따라서 총 30의 피해를 줄 수 있습니다."}
    ]},
    {"messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "유닛의 HP가 50일 때, 네더 블레이드가 1턴에 이 유닛을 정리할 수 있나요?"},
        {"role": "assistant", "content": "아니요, 네더 블레이드는 1턴에 유닛을 정리할 수 없습니다. "
                                         "네더 블레이드의 광역기는 10의 피해를 주고, 단일기는 20의 피해를 줍니다. 따라서 총 30의 피해를 줄 수 있습니다."}
    ]}
]

def save_training_data(training_data, filename="training_data.jsonl"):
    with open(filename, "w") as f:
        for item in training_data:
            f.write(json.dumps(item) + "\n")

save_training_data(training_data)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 파인 튜닝 함수 정의
def start_fine_tuning():
    save_training_data(training_data)

    file_path = "training_data.jsonl"
    with open(file_path, "rb") as f:
        response = openai.files.create(file=f, purpose='fine-tune')

    print(f"File upload response: {response}")

    file_id = response.id
    fine_tune_response = openai.fine_tuning.jobs.create(
        training_file=file_id,
        model='gpt-3.5-turbo-0613'
    )

    print(f"Fine-tuning started with ID: {fine_tune_response}")
    return fine_tune_response.id
1
2
3
4
5
6
# 정해진 router로 요청이 오면 파인 튜닝을 시작하도록 함
@openAiFineTuningTestRouter.post("/fine-tune")
def fine_tune_model(background_tasks: BackgroundTasks):
    fine_tune_id = start_fine_tuning()
    background_tasks.add_task(check_fine_tune_status, fine_tune_id)
    return { "status": "Fine-tuning started", "fine_tune_id": fine_tune_id }
1
2
3
4
5
6
7
8
9
10
11
# 파인 튜닝이 진행중인지 끝났는지 확인하는 함수 정의
def check_fine_tune_status(fine_tune_id):
    status_response = openai.fine_tuning.jobs.retrieve(fine_tune_id)
    status = status_response.status
    print(f"Fine-tuning status for {fine_tune_id}: {status}")

# 정해진 router로 요청이 오면 상태 확인하도록 함
@openAiFineTuningTestRouter.get("/fine-tune-status/{fine_tune_id}")
def get_fine_tune_status(fine_tune_id: str):
    status_response = openai.fine_tuning.jobs.retrieve(fine_tune_id)
    return { "status_response": status_response }

:face_with_spiral_eyes:Lacked

이번 주동안 감기에 걸려서 컨디션이 좋지 않았습니다:sob:
앓는소리

더 열심히 할 수 있었는데 몸 상태가 안좋아서 집중하지 못한 것 같아서 아쉽습니다.
주말동안 쉬면서 몸 상태를 원상복귀시키도록 하겠습니다!


:thought_balloon:Longed for

이제 슬슬 최종 프로젝트가 가까워지고 있습니다.
긴장되기도 하고 설레기도 하고 그런데, 제가 부족하거나 게으름피워서 팀원들에게 피해가 가지 않았으면 좋겠습니다.
그러려면 제가 열심히 해야겠죠?
남은 기간도 지금처럼 열심히하면서 무사히 마무리하도록 하겠습니다.
image

모두 몸 조심하시고 건강하세요!

This post is licensed under CC BY 4.0 by the author.