paint-brush
내 텔레그램 채팅 기록으로 Llm을 미세 조정했습니다. 내가 배운 내용은 다음과 같습니다.~에 의해@furiousteabag
1,512 판독값
1,512 판독값

내 텔레그램 채팅 기록으로 Llm을 미세 조정했습니다. 내가 배운 내용은 다음과 같습니다.

~에 의해 Alex7m2024/06/13
Read on Terminal Reader

너무 오래; 읽다

나는 내 글쓰기 스타일과 대화 패턴을 복제할 수 있는지 확인하기 위해 텔레그램 메시지를 사용하여 언어 모델을 미세 조정했습니다. 나는 성능을 위해 Mistral 7B 모델을 선택했고 LoRA(low-rank Adaptation)와 전체 미세 조정 접근 방식을 모두 실험했습니다. 저는 5년 동안 총 15,789개의 세션에 달하는 모든 텔레그램 메시지를 추출하고 처음에는 일반 대화를 미세 조정한 Mistral 모델을 사용하여 테스트했습니다. LoRA의 경우 RTX 3090의 교육에는 5.5시간이 걸렸고 비용은 2달러였습니다. 스타일 모방은 향상되었지만 맥락과 문법에 어려움을 겪었습니다. 8개의 A100 GPU를 사용하여 전체 미세 조정을 수행하여 언어 성능과 컨텍스트 유지가 향상되었지만 여전히 일부 오류가 있었습니다. 전반적으로 모델은 대화 스타일과 일반적인 주제를 잘 포착했지만 응답의 맥락이 부족한 경우가 많았습니다.
featured image - 내 텔레그램 채팅 기록으로 Llm을 미세 조정했습니다. 내가 배운 내용은 다음과 같습니다.
Alex HackerNoon profile picture
0-item
1-item

내가 교류하는 대부분의 사람들에게 나는 대부분의 경우 또 다른 텍스트 기반 프로그램일 뿐입니다. 입력과 출력이 이렇게 단순하다면 모델로 대체할 수 있을까요? 이것이 작동하려면 모델이 내 글쓰기 스타일을 이해해야 할 뿐만 아니라 나에 대해 많은 것을 알아야 합니다. 이에 대한 가장 좋은 소스는 제가 매일 사용하는 Telegram 메신저입니다. 여기에는 채팅 기록의 형태로 내 생각과 행동에 대한 거의 모든 내용이 포함되어 있습니다.

접근하다

가장 간단한 접근 방식은 모든 메시지를 추출하여 ChatGPT의 컨텍스트에 로드하고 이 정보를 사용하여 새 메시지에 응답할 때 내 스타일을 모방하도록 지시하는 것입니다. 그러나 이 접근 방식은 컨텍스트 창 크기에 의해 제한되므로 핵심 사항을 추출하려면 메시지를 전처리해야 합니다. 이러한 번거로움을 피하고 싶기 때문에 필요할 때 필요한 정보를 가져오는 데 RAG(검색 증강 생성)를 사용할 수 있습니다. 그러나 내 경험에 따르면 채팅 세션과 같은 다양한 데이터에서 검색하려면 일반적으로 검색 모델에 대한 감독된 미세 조정이 필요하며 저는 그러한 데이터 세트를 만드는 데 관심이 없습니다. 따라서 미세 조정이 최선의 선택인 것 같습니다. 여러 가지 이유로 이상적입니다. 내 글쓰기 스타일을 포착하고 중요한 내용을 선택하지 않고도 내 모든 메시지에서 지식을 축적할 수 있어야 하기 때문입니다.


OpenAI는 미세 조정 기능을 제공하지만 개인 메시지를 사용하므로 타사 미세 조정 서비스를 사용하고 싶지 않습니다. 그래서 기본 모델을 선택해야 합니다. Hugging Face Open LLM Leaderboard 에 따르면 가장 작은 모델(13B 매개변수 이하) 중 하나는 Mistral 7B 입니다. 심지어 Llama 2 13B 보다 성능이 뛰어납니다. 이제 문제는 LoRA 만으로 충분한지, 아니면 완전한 미세 조정이 필요한지 여부입니다. 다양한 비교 [1] [2] 에 따르면 LoRA는 전체 미세 조정보다 약간 나쁘지만 대부분의 경우 여전히 괜찮습니다. 하지만 저와 같은 특정 작업(러시아어 + 채팅)의 경우 연구자들이 제 목표와 복잡성이 비슷한 라마 교육 미세 조정을 중국어로 수행한 논문을 발견했습니다. 그들은 사전 명령 조정 없이 기본 모델에서 LoRA 기반 조정이 전체 미세 조정보다 덜 효과적이라는 것을 발견했습니다. 그러나 이미 지침에 맞게 미세 조정된 모델을 LoRA 기반으로 조정하면 비슷한 결과를 얻을 수 있습니다. 제 경우에는 기본 모델을 완전히 미세 조정하거나 러시아어 채팅을 위해 이미 미세 조정된 모델에서 LoRA를 의미합니다. 러시아어 채팅에 맞게 미세 조정된 모델을 찾을 수 없었기 때문에 미세 조정된 Mistral 모델 Dolphin 처럼 영어 채팅에 미세 조정된 모델에 LoRA를 사용해 보겠습니다.


따라서 계획은 다음과 같습니다.

  1. 미세조정된 미스트랄 영어채팅 돌핀 위에 LoRA부터 시작해 보세요
  2. 품질이 충분하지 않은 경우 Mistral에서 전체 미세 조정을 시도해보세요.

데이터 준비

이메일과 비교할 때 Telegram과 같은 앱 메시징의 독특한 측면 중 하나는 대화 흐름입니다. 메시지는 일반적으로 귀하와 귀하의 연락처 간에 하나씩 번갈아 표시되지 않습니다. 대신, 연속해서 몇 개의 메시지를 보낸 후 상대방이 몇 가지 응답을 보내는 경우가 많습니다. 이러한 메시지도 일반적으로 짧습니다. 나는 내 데이터에서 이러한 자연스러운 대화 스타일을 유지하고 싶었습니다.


텔레그램은 모든 채팅을 JSON으로 내보내는 기능을 내장 하고 있습니다. 메시지를 필터링하고 세션으로 그룹화한 후 지난 5년간 Telegram을 사용한 데이터를 편집했습니다. 그 결과 466개의 채팅에서 15,789개의 세션이 발생했으며 평균 세션 길이는 8.51개의 메시지였습니다. 데이터 구조화를 위해 ChatML 프롬프트 형식을 선택했습니다. 다음은 샘플 세션입니다(러시아어에서 번역됨):


<|im_start|>존 스미스
>>> 젠장, 135시간 제한을 못 넘기네요

>>> 모든 것을 최적으로 처리하려고 노력했지만 운이 없었습니다<|im_end|>

<|im_start|>알렉산더 스미르노프
>>> 응 똑같아

>>> 아직도 같은 생각을 하고 계시나요?<|im_end|>

<|im_start|>존 스미스
>>> 모르겠어, 내 생각엔 우리가 같은 입장인 것 같아

>>> 말씀하신대로

>>> 역방향 문자열을 사용하여 거기에서 뭔가를 찾으려고 노력합니다.

>>> z 함수가 모든 것을 망쳐버리기 때문에 진짜 똥인 것 같습니다......<|im_end|>

<|im_start|>알렉산더 스미르노프
>>> z가 어디에 들어가는지 이해하지 마세요<|im_end|>

<|im_start|>존 스미스
>>> 어쨌든 모든 것을 반복적으로 수행하는 것 같지만, z 함수를 작성하려면 일부 문자열을 뒤집어야 합니다.

>>> 그리고 그것은 단지 무작위적인 해결책일 뿐입니다.

>>> 토론에서<|im_end|>

<|im_start|>알렉산더 스미르노프
>>> 알겠습니다<|im_end|>


내 데이터 수집기는 손실이 누군가의 응답을 기반으로만 계산되도록 보장합니다. 다음에 누가 말할지 예측하는 것은 상대적으로 간단하며 모델이 이를 학습하는 데 집중하는 것을 원하지 않습니다. 따라서 손실이 계산되는 대화 부분은 굵게 강조 표시됩니다.


내 응답뿐만 아니라 다른 사람들의 응답도 손실 계산에 사용된다는 것을 알 수 있습니다. 이것은 의도적인 것입니다. 이렇게 하면 모델은 나뿐만 아니라 자주 대화하는 파트너 역할도 할 수 있게 됩니다!

평가계획

두 가지 방법으로 채팅을 통해 모델을 테스트하겠습니다. 먼저, 모델이 저인 것처럼 행동하고, 다양한 친구들의 관점에서 나 자신과 대화를 나눠보겠습니다. 그런 다음 모델이 친구 역할을 하는 동안 저는 나 자신으로 채팅하겠습니다. 내 대화의 시작은 항상 "안녕"과 "무슨 일이야?"라는 동일한 2개의 메시지입니다. (러시아어에서는 "прив" 및 "как дела?"). 생성된 문구와 인물이 모델로 등장하여 강조 됩니다. 테스트를 위해 oobabooga/text- Generation-webui 를 사용하겠습니다.


처음에는 일반 대화를 미세 조정한 Mistral 모델이 내 측의 사전 교육 없이 해당 작업을 어떻게 처리하는지 살펴보고 싶습니다.


친구 1 vs 알렉산더 스미르노프


알렉산더 스미르노프 vs 친구 1


좋습니다. 일관된 문장을 만들 수 있습니다. 가장 눈에 띄는 문제는 대화의 맥락에 대한 인식이 부족하여 단조롭고 일반적인 답변으로 이어진다는 것입니다. 메시지에는 뚜렷한 스타일이 부족하여 매우 기본적인 느낌이 들었습니다. 또 다른 문제는 모델의 러시아어가 형편없다는 점이다. 이는 모델이 너무 작아서 기본 언어인 영어 이외의 언어로 일반화할 수 없기 때문에 예상됩니다. 또한 모델은 지나치게 적극적이어서 거의 모든 문장을 질문으로 끝내는 경향이 있었는데, 이는 실제 사람들이 일반적으로 메신저에서 의사소통하는 방식이 아닙니다.


이 모든 것을 고치려고 노력합시다!

로라

LoRA는 교육 파이프라인과 하드웨어 요구 사항 측면에서 간편한 접근 방식을 제공합니다. 전체 중량의 약 1%를 훈련합니다. 저는 1024 시퀀스 길이와 배치 크기 8을 선택했습니다. RTX 3090에서 20GB의 VRAM을 소비한 훈련은 3개의 에포크가 걸렸고 5.5시간 동안 지속되었습니다. 이를 위해 나는 broad.ai를 사용했는데, 여기서 GPU 비용은 시간당 $0.362였으며 실험 및 버그 수정에 소요된 시간을 제외하고 전체 교육에 총 $2였습니다.


결과는 다음과 같습니다.


친구 1 vs 알렉산더 스미르노프


친구 2 vs 알렉산더 스미르노프


알렉산더 스미르노프 vs 친구 1


알렉산더 스미르노프 vs 친구 2


이것이 훨씬 낫습니다. 응답하는 사람의 스타일을 확실히 포착합니다. 또한 특정 쌍의 사람들 간에 논의되는 가장 일반적인 주제를 식별합니다. 예를 들어, 친구 2의 경우에는 분명히 일에 더 집중합니다. 하지만 여전히 문법이 어긋나고, 대화의 맥락을 빨리 잃어버리게 됩니다. 나는 LoRA가 영어에서 합리적인 품질로 작동할 것이라고 확신하며 완전한 미세 조정이 필요하지 않을 수도 있습니다. 하지만 러시아어는 모델의 모국어가 아니기 때문에 전체 미세 조정을 시도해 보겠습니다.

전체 미세 조정

다중 GPU 교육이 필요하기 때문에 전체 미세 조정이 더 어렵습니다. 널리 사용되는 방법으로는 ZeRO & DeepSpeed [3] 또는 FSDP [4] 가 있으며, FSDP는 본질적으로 ZeRO3 [5] 입니다. 저는 FSDP를 선택하기로 결정했습니다.


트레이닝 파이프라인을 구현하면서 Stanford Alpaca 미세 조정 코드Anton Bacaj의 Mistral 미세 조정 코드를 참고했습니다.


시퀀스 길이가 1024이고 마이크로 배치 크기가 2인 반정밀도 FSDP 전체 샤드를 사용하려면 8개의 A100 80GB GPU 각각에 63GB의 VRAM이 필요합니다. 3개의 에포크(Epoch) 동안 진행된 훈련에는 단 20분밖에 걸리지 않았습니다. VM의 총 비용은 시간당 8.88달러이므로 실험 및 버그 수정 시간을 제외하면 3달러가 발생합니다.


대화:


친구 1 vs 알렉산더 스미르노프


친구 2 vs 알렉산더 스미르노프


알렉산더 스미르노프 vs 친구 1


알렉산더 스미르노프 vs 친구 2


여전히 맥락을 잃을 위험이 있지만 대화는 더욱 흥미롭고 매력적으로 변했습니다. 러시아어 성능이 향상되었으나 여전히 오류가 발생합니다. 나는 나와 같이 데이터가 제한된 특정 작업을 미세 조정하기 전에 먼저 대규모 러시아어 텍스트 모음에서 감독되지 않은 모델을 미세 조정하는 것이 유익할 것이라고 믿습니다. 또한 공통 대화 상대의 이름을 별도의 토큰으로 통합하면 품질이 향상될 수 있습니다.


LoRA보다 훨씬 낫다고는 말할 수 없습니다. 대화상대 한 명 한 명을 모두 알아보려고 하기보다는 한 사람에게만 집중하고 내 반응(혹은 다른 사람)의 반응만을 토대로 손실을 계산하는 것이 더 효과적일 수 있습니다.

마무리 생각

물론, 모델의 답변이 대부분 부적절해서가 아니라 “나중에 전화할게”, “바빠”, “알았어”와 같은 단순한 응답이 많았기 때문에 결과를 선별해야만 했다. 대화에서. 그럼에도 불구하고 이 모델은 자신이 흉내내는 사람의 스타일을 흉내내는 데 탁월하다는 것이 분명합니다. 두 사람 사이에 자주 논의되는 주제도 포착합니다. 그러나 대화의 맥락이 크게 부족합니다. "요, 그래서?"와 같은 질문에 응답합니다. 또는 "주말에 계획이 무엇입니까?"는 완전한 맥락 없이는 어려운 일입니다. 아마도 사용자가 컴퓨터에서 수행하는 모든 작업을 캡처하는 Rewind 와 같은 시스템을 활용하는 것이 도움이 될 수 있습니다.

암호

이 프로젝트에 대한 코드는 물론 내 github 저장소 의 Telegram 덤프에서 직접 복제하는 방법에 대한 지침도 찾을 수 있습니다. 훈련 로그는 WandB 에서 액세스할 수 있습니다.


Unsplash의 Christian Wiediger 가 작성한 리드 이미지