AIcrowd Amazon KDD Cup 24: Shopping Knowledge Reasoning 대회 준비 과정(3)

백승헌·2024년 5월 23일
0

AIcrowd - LLM finetuning

목록 보기
3/4
post-custom-banner

학습에 대한 내용을 적어보도록 하겠습니다.
이제 학습코드가 잘 작동하는 것을 확인했고 학습을 진행했습니다.
본 글은 후기를 적는 것이기에 코드는 제공하지는 않겠습니다..!
어차피 구글링하면 나오기도 하고 각자 수정하여 본인에 맞게 사용해야 하기에..

llam3-8B-bnb-4bit 모델을 사용하였습니다.

학습을 하려면 데이터를 그냥 넣으면 되는 것이 아니라 하나의 text로 넣어야 한다고 합니다.

앞서 학습데이터를 query, response 로 만들어 학습을 진행하려고 하였습니다. start_kit에 있는 데이터와 유사하게 만들기 위해 더 필요한 과정이 있습니다.

먼저 쿼리의 맨 밑에 Answer: 가 붙어야 할거라고 생각해 query뒤에 Answer:를 붙였습니다.
최종적으로 query와 response를 갖게 되었습니다.

이제 학습에 맞게... 프롬프트를 작성해야 합니다.

학습 프롬프트 text 만들기

학습에는 하나의 프롬프트만 넣어서 학습을 진행합니다.(llama3-8bit)

df['query']=df['query'].apply(lambda x: x.replace('\nAnswer:', ''))

df['text'] = df.apply(lambda row: f'''<|begin_of_text|>
<|start_header_id|>system<|end_header_id|>
Select the most appropriate answer from the given options with following the multiple choice question. 
The options are represented as integer and end mark. 
it is important to consider options without bias from ordering because options are not related to probability.
You must choose only one of the integer options that have given. <|eot_id|>
<|start_header_id|>user<|end_header_id|>
question: {row['query']}<|eot_id|>
<|start_header_id|>assistant<|end_header_id|>
{row['response']}<|eot_id|>
<|end_of_text|>	''', axis = 1)

이런 식으로 'text'라는 새로운 열을 만듭니다.

이러한 코드로 파라미터를 설정하고 text를 넣어 학습하면 됩니다.
위 코드는 이전에 작성했던거라 제가 사용한 모델은 아닙니다.!
(수 많은 시행착오 중 하나...)

이렇게 학습이 다 되면 adapter 모델이 저장이 됩니다.
이모델은 베이스모델과 함께 사용이 됩니다. (우리의 베이스모델은 llama3)

사실 학습이 되었고 문제를 input으로 넣었더니 답을 내기는 하는데 말이 너무 많습니다... 우리는 답하나만 출력해야하는 설명을 계속합니다..ㅠ...
아무리 프롬프트를 수정해도 되지않아 출력에 정규식을 사용하였습니다.

match = re.search(r'\d', prompt.split("assistant\n")[1])
        if match:
            return str(match.group())

assitant라는 출력을 기준으로 나누고 처음으로 나온 숫자를 str로 변환하여 뱉어내는 것으로 적용하였습니다..ㅎㅎ
(이건 야매이지 않을까 싶지만.. 시간이 없었습니다...ㅠㅠㅠ)

그리고 local_evaluation 코드를 돌려보니 0.79점이 나왔습니다..!

실제 점수도 아니고 몇문제 안되는 것이었지만 1점이 만점이라 엄청 좋은 점수가 나와서 기뻤습니다. leaderboard에서의 1위 기록이 0.791점이었기에..

이제 신나서 제출을 하려했으나 제출이라는 벽에 막혔습니다..

최종보스: 제출

제출을 하는 과정은 간단합니다.
start_kit gitlab을
fork-> clone -> 수정 -> add ,commit, push 하면 됩니다.

git은 이미 많이 다뤄봤기에 문제가 없어서 제출을 했는데... failed,
log을 찾아보니 requirements를 수정하지 않았더군요...

그래서 계속 수정하고 제출 수정하고 제출을 반복했는데 너무 비효율적이라고 생각이 되어 QnA를 찾아보니 start_kit에 docker_file을 먼저 실행하고 제출을 하라더군요....!

이 과정이 거의 4~5일이 걸린 것 같습니다...
requirements 파일과 dockerfile을 수정하여 환경을 완벽하게 구성하였습니다. 이제는 되겠지...
하지만 역시 failed...
이유를 찾아보니 제가 사용하는 gpu는 rtx40490인데 제출환경은 a100을 사용하여 dtype이 맞지 않는다고 하였습니다.

제가 사용한 모델의 config.json을 보니 dtype이 bfloat16으로 되어있어서 float16으로 변경하였더니 드디어 제출이 되었습니다...

드디어 제출..!

총 4단계로 제출이 진행되는데 맨앞 환경 구성에 3일 정도 사용하였습니다...
제발 다음단계만 넘어가자고 했고 requirement를 수정하고 docker를 수정하면서 넘어갔습니다..! 사진상으론 몇초지만 사실 일주일 동안 저기서 막혔었습니다...ㅠ

넘어가자마자failed... 웹오류로 failed이라는 글자는 안떴지만 빨간색은 failed 입니다. 환경은 구성이 됐지만 dtype과 dockerfile을 더 수정해야했습니다. python 버전과 cuda버전 수정..

드디어 모든 에러를 잡고 넘어갔습니다. 여기까지 온다면 다 된 것입니다..ㅠ... 제한시간은 40분이라고 하고 1229개의 문제를 40분안에 출력해내면 됩니다. 개당 2초 안쪽이면 됐고 제가 튜닝한 모델은 개당 0.4초가 걸렸습니다..!

최종적으로 올라갔고 지금보니 100등 이더군요...
사실 더 낮은 점수였었는데 학습 안한걸 올렸더군요..ㅎ..

성공의 제출은 일주일에 최대 3번까지 가능해서 마지막으로 학습을 한번 더 해서 제출을 했습니다.

최종 결과

최종적으로 등수는 86등으로 마무리했습니다..! 참가팀은 총 508팀으로
그중 86등을 한 것에 매우 만족합니다...

글을 매우 중구난방으로 작성한 것 같습니다... 사실 이 대회를 기록하기 위해 만든 블로그이기도 한데... 앞으로 다른 글은 더 이쁘게 작성해보겠습니다.

사실 대회를 준비하는 것도 많이 중구난방이었고 더 정신없이 진행했고 복잡한 부분을 빼고 그랬기에 더 정신없는 글이 된 것 같습니다...
여튼 그래도 처음엔 제출에 의미를 뒀었는데 나름 좋은 성적(?)까지 나온 것 같아서 매우 의미있고 많은걸 배운 대회였습니다!!

fin

profile
취미가 많은 대학원생
post-custom-banner

0개의 댓글