ChatGPT와 같은 LLM 모델의 성장으로 기업에서는 언어 기반 딥 러닝 애플리케이션을 상용화하기 위해 서두르고 있습니다. Duolingo 및 Blinkist와 같은 회사는 교육용 채팅 애플리케이션을 구축하고 있으며 Cocounsel과 같은 기업은 문서 분석 모델을 구축하고 있으며 MedGPT와 같은 일부 기업은 의료 진단과 같은 작업을 수행할 수 있는 전문 모델도 구축하고 있습니다. 이전 기사에서는 누군가 ChatGPT와 프롬프트 엔지니어링을 사용하여 강력한 문서 분석기를 구축하는 방법에 대해 썼습니다.
보다 강력하고 도메인별 LLM 애플리케이션을 지원하기 위해 기술 제공업체는 다양한 클라우드 솔루션을 제공했습니다. 예를 들어 ChatGPT를 개발한 회사인 OpenAI는 간단하지만 강력한 미세 조정 API를 사용자에게 제공하여 사용자가 GPT3 기술을 기반으로 자신만의 언어 모델을 구축할 수 있도록 했습니다. Google은 이에 뒤처지지 않기 위해 GPT 3 및 GPT 3.5의 유능한 경쟁자로 널리 간주되는 들소 텍스트 모델을 Google Cloud 플랫폼을 통해 미세 조정할 수 있도록 만들었습니다. 이전 기사에서는 Fine Tuning API를 사용하여 도메인 전문가 LLM을 만드는 방법에 대해 썼습니다.
이러한 서비스가 강력하기 때문에 LLM 기술에 대한 진지한 투자를 고려하는 회사는 오픈 소스 기술을 통해 자체 모델을 훈련하는 방법을 배우고 싶어할 것입니다. 이러한 공급업체 제공 엔드포인트를 사용하는 것과 비교하여 자체 모델을 교육하면 다음과 같은 이점이 있습니다 .
이 기사에서는 인기 있고 유능한 오픈 소스 LLM 모델을 가져와 이전 기사에서 수행한 것과 유사한 자체 데이터로 교육하고 결과를 검증합니다. 우리가 다루고 있는 예는 비상업적이며 공개 정보를 기반으로 하지만 이 기술은 상업적인 노력에 쉽게 교차 적용될 수 있습니다. 이 기사에서 해결하려는 문제를 정의하는 "전문가 LLM 모델" 섹션에서 이 기술을 사용하여 어떤 상용 응용 프로그램을 구축할 수 있는지에 대한 구체적인 제안을 살펴보겠습니다 .
오늘의 실험에서는 Google에서 출시한 대규모 언어 모델인 Flan-T5 Large를 사용 하겠습니다. 이것이 Bard의 기반이 되는 기술은 아니지만, 이 모델은 GPT 기반 기술과 경쟁할 수 있는 것으로 널리 간주됩니다. 그러나 Flan T5 모델의 인상적인 점은 GPT 기반 모델보다 훨씬 적은 매개변수를 사용하여 만족스러운 결과를 달성한다는 것입니다. 예를 들어 모델의 XL 버전에도 1,750억 개의 매개변수가 있는 GPT3에 비해 30억 개의 매개변수만 있습니다.
이러한 소형화로 인해 이러한 모델을 클라우드 컴퓨팅 자산에 교육하고 저장하는 것이 상대적으로 저렴합니다. 또한 Flan-T5 모델 제품군은 상업적 사용을 허용하는 Apache 라이센스와 함께 출시되어 다른 오픈 소스 LLM 중 일부에 수반되는 잠재적인 라이센스 문제를 줄입니다. 예를 들어 Facebook의 LLaMa는 여전히 연구 및 비상업적 목적으로만 사용할 수 있습니다.
이 기사를 작성하기 위해 저는 기술의 효율성을 테스트하기 위해 몇 가지 다양한 작업 클래스를 실험했습니다. 일반적으로 Flan-T5, 특히 XL 변형은 시중의 일부 GPT 모델과 유사한 뛰어난 자연어 이해 기능을 갖춘 것으로 보입니다. 그러나 추상적인 연결을 그릴 때 모델이 다소 부족하고 긴 출력을 생성하는 데 약간의 문제가 있습니다. 따라서 올바른 작업에 적합한 모델을 선택하는 데 주의를 기울여야 합니다.
Replicate는 저렴한 가격에 대규모 AI 모델을 훈련하고 실행하기 위해 GPU를 임대 할 수 있는 서비스형 플랫폼(Platform-as-a-Service) 회사입니다. AI 모델 관리 도구 제품군을 사용하면 사용자는 서버 리소스 관리 대신 데이터 작업에 집중할 수 있습니다.
이 기사를 작성하기 위해 AWS SageMaker, Google Colab 및 PaperSpace Gradient를 포함한 여러 AI 교육 PaaS 제품을 사용해 보았습니다. Replicate는 시작하기 가장 쉬운 플랫폼이었고 언급된 다른 서비스에 비해 매우 경쟁력 있는 가격을 제공했습니다.
Python은 데이터 엔지니어링의 공용어입니다. 광범위한 에코시스템을 통해 프로그래머는 데이터를 신속하게 수집, 분석 및 처리할 수 있습니다. 대부분의 주요 AI 교육 플랫폼은 Python을 최고 수준으로 지원하므로 작업이 훨씬 쉬워집니다. Replicate의 뛰어난 통합 덕분에 오늘은 모든 코드를 Python으로 작성하겠습니다.
Flan-T5 모델 제품군은 텍스트를 생성하는 것보다 텍스트를 이해하는 데 훨씬 더 뛰어나기 때문에 입력은 무겁지만 출력은 가벼운 작업을 선택하려고 합니다. 자연어 분류기는 이러한 유형의 시나리오에 대한 완벽한 사용 사례이므로 오늘은 극작가 식별자를 구축해 보겠습니다. 특히, 우리는 윌리엄 셰익스피어나 안톤 체호프의 모델 구절을 제공하고, 글쓰기 스타일과 단어 선택을 기반으로 극작가를 식별하도록 모델을 가르칠 수 있는지 알아볼 것입니다.
물론 이것은 공개 튜토리얼이기 때문에 의도적으로 공개되고 쉽게 액세스할 수 있는 데이터가 포함된 모델을 선택하고 있습니다. 그러나 이는 상업적인 맥락에 쉽게 적용될 수 있습니다 . 다음은 자연어 분류기가 유용할 수 있는 몇 가지 예입니다.
훈련 데이터를 생성하기 위해 Project Gutenberg에서 Anton Chekhov와 William Shakespeare 연극 일부를 다운로드할 수 있습니다. 데이터 수집을 설정하려면 다음 Python 스크립트를 실행할 수 있습니다.
import requests import openai import replicate import os import pandas as pd import random texts = { 'chekhov': 'https://www.gutenberg.org/files/7986/7986-0.txt', 'chekhov_2': 'https://www.gutenberg.org/cache/epub/1755/pg1755.txt', 'shakespeare_midsummer': 'https://www.gutenberg.org/cache/epub/1514/pg1514.txt', 'shakespeare_romeo_juliet': 'https://www.gutenberg.org/cache/epub/1112/pg1112.txt', 'shakespeare_macbeth': 'https://www.gutenberg.org/cache/epub/2264/pg2264.txt', 'shakespeare_hamlet': 'https://www.gutenberg.org/cache/epub/2265/pg2265.txt', }
이제 교육 데이터 폴더를 만들고 텍스트를 다운로드합니다.
if not os.path.exists('training_text'): os.mkdir('training_text') for name, url in texts.items(): print(name) res = requests.get(url) with open(os.path.join('training_text', '%s.txt' % name), 'w') as fp_write: fp_write.write(res.text)
성공했음을 보여주기 위해 다음과 같은 출력이 표시되어야 합니다.
chekhov chekhov_2 shakespeare_midsummer shakespeare_romeo_juliet shakespeare_macbeth Shakespeare_hamlet
training_text 폴더를 확인하여 파일이 제대로 다운로드되었는지 확인할 수도 있습니다.
이제 우리는 이 파일을 다시 메모리로 읽어 들여 라인 목록으로 분할하려고 합니다. 그 동안 각 파일의 줄 수를 세어보겠습니다.
lines_by_file = {} for fn in os.listdir('training_text'): if not fn.endswith('.txt'): continue with open(os.path.join('training_text', fn)) as fp_file: lines_by_file[fn.split('.')[0]] = '\n'.join(fp_file.readlines()) print(fn, len(lines_by_file[fn.split('.')[0]]))
아래와 같은 출력이 표시됩니다.
shakespeare_midsummer.txt 120198 shakespeare_romeo_juliet.txt 179726 shakespeare_macbeth.txt 140022 shakespeare_hamlet.txt 204169 chekhov.txt 419063 chekhov_2.txt 148324
이제 재미있는 부분이 나옵니다. 우리는 라인을 실제 훈련 데이터로 분할하고 싶습니다. 이를 위해 먼저 소개, 머리글 및 바닥글 내용을 차지하는 첫 번째와 마지막 1000줄을 제거합니다. 그런 다음 나머지 텍스트 50줄을 한 번에 가져옵니다. 그런 다음 50줄을 프롬프트 및 완료 쌍으로 변환합니다.
train_data = [] for k in lines_by_file: is_chekhov = 'chekhov' in k useful_lines = lines_by_file[k].split('\n')[1000:-1000] prompt_fmt = "Which playwright wrote the following passage? \n ==== \n %s \n ====" for i in range(0, len(useful_lines), 50): training_set = useful_lines[i: i+50] train_data.append({ 'prompt': prompt_fmt % '\n'.join(training_set), 'completion': 'Anton Chekhov' if is_chekhov else 'William Shakespeare' })
이제 우리는 문제를 명확하게 정의했습니다. 연극의 텍스트 50줄이 주어지면 극작가가 안톤 체코프인지 윌리엄 셰익스피어인지 판단하는 것입니다. 아직 끝나지 않았습니다. 훈련을 위해 데이터를 jsonl(JSON Lines) 형식으로 작성해야 하며 테스트 목적으로 몇 가지 샘플도 예약하려고 합니다. 다음 코드를 다음과 같이 실행하세요.
df = pd.DataFrame(train_data) df_chekhov = df[df['completion'] == 'Anton Chekhov'] df_shakespeare = df[df['completion'] == 'William Shakespeare'] chekhov_test_indices = random.sample(df_chekhov.index.tolist(), 15) shakespeare_test_indices = random.sample(df_shakespeare.index.tolist(), 15) df_chekhov_test = df_chekhov.loc[chekhov_test_indices] df_shakespeare_test = df_shakespeare.loc[shakespeare_test_indices] df_chekhov_train = df_chekhov.loc[[i for i in df_chekhov.index if i not in chekhov_test_indices]] df_shakespeare_train = df_shakespeare.loc[[i for i in df_shakespeare.index if i not in shakespeare_test_indices]] pd.concat([df_chekhov_train, df_shakespeare_train]).to_json('chekhov_shakespeare_train.jsonl', orient='records', lines=True) pd.concat([df_chekhov_test, df_shakespeare_test]).to_json('chekhov_shakespeare_test.jsonl', orient='records', lines=True)
물론 전체 코퍼스를 훈련에 사용하려면 간단히 다음을 실행하면 됩니다.
pd.DataFrame(train_data).to_json('output.jsonl', orient='records', lines=True)
.
훈련을 호출하기 전에 두 가지 작업을 수행해야 합니다. 먼저, 복제를 통해 액세스할 수 있는 위치에 훈련 데이터를 업로드해야 합니다. 이를 수행하는 매우 쉬운 방법 중 하나는 파일을 Google Cloud 버킷에 업로드하고 버킷과 파일을 공개로 설정한 다음 https://storage.googleapis.com/<bucket_name>/<file_name>
형식으로 URL을 제공하는 것입니다. https://storage.googleapis.com/<bucket_name>/<file_name>
.
다음으로 목적지를 생성해야 합니다. 이를 수행하려면 Replicate(Github OAuth를 통해 수행 가능)에 로그인하고 새 모델을 생성하기만 하면 됩니다. 모델이 생성되고 이름이 지정되면 모델을 이 공간으로 푸시할 수 있습니다.
모든 것이 설정되면 다음과 같이 교육을 시작할 수 있습니다.
training = replicate.trainings.create( version="[flant5-large location]", input={ "train_data": "[Data Location]", }, destination="[Destination]" ) print(training)
훈련이 시작되고 있음을 알려주는 출력이 표시되어야 합니다. 몇 분 정도 기다린 후 다음 코드를 실행하여 교육을 다시 확인하세요.
training.reload() print(training)
Replicate 웹사이트에서 교육 진행 상황을 모니터링할 수도 있습니다. 훈련이 완료되면 훈련 객체를 다시 로드하여 출력 이름을 얻고 다음 단계로 진행할 수 있습니다.
GPU 리소스가 부족한 기간이 있으며 "훈련 실패" 오류가 발생할 수 있다는 점에 유의하세요. 이런 일이 발생하면 몇 시간 정도 기다렸다가 다시 시도해 보세요. GPU가 부족하고 PaaS 제공업체도 면역되지 않습니다!
괜찮은! 이제 미세 조정된 모델이 있으므로 테스트해야 합니다. 테스트를 위해 15개의 체호프와 셰익스피어 구절을 예약해 두었음을 기억하세요. 여기서는 다음과 같이 사용할 수 있습니다.
for _, row in df_chekhov_test.iterrows(): output = replicate.run( training.output["version"], input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
짧은 시작 기간이 지나면 출력이 콘솔에 인쇄되는 것을 볼 수 있습니다. 모델은 매우 정확해야 하며 매번 "Anton Chekhov"를 반환해야 합니다. 셰익스피어로 이것을 시도해 봅시다:
for _, row in df_shakespeare_test.iterrows(): output = replicate.run( training.output["version"], input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
Chekhov의 예와 유사하게 모델이 매번 셰익스피어를 식별할 수 있다는 것을 알 수 있습니다.
좋은 측정을 위해 기본 모델이 셰익스피어 또는 체호프를 식별할 수 있는지 살펴보겠습니다.
for _, row in df_shakespeare_test.iterrows(): output = replicate.run( "[base flant5-large location]", input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('') for _, row in df_chekhov_test.iterrows(): output = replicate.run( "[base flant5-large location]", input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
기본 모델이 동일한 구절의 극작가를 확실하게 식별할 수 없음 을 확인해야 합니다. 이는 우리의 미세 조정이 모델에 새로운 정보를 안정적으로 제공했으며 자연어 극작가 분류기를 자체적으로 구축했음을 보여줍니다!
오늘 기사에서는 Google에서 제공하는 대규모 언어 모델인 Flan-T5를 기반으로 간단한 자연어 분류기를 훈련했습니다. 컴팩트한 크기와 허용되는 라이센스 덕분에 Flan-T5는 개인 인프라에서 교육 및 배포가 가능하며, 이는 ChatGPT와 같은 시중의 다른 인기 모델과 차별화됩니다.
오늘의 예는 공개 데이터를 기반으로 했으며 확실히 비상업적이었지만 이 개념 증명은 위에 설명된 대로 다른 많은 상업용 응용 프로그램에 쉽게 적용할 수 있습니다. 현실로 전환하고 싶은 LLM 아이디어가 있다면 내 GitHub 또는 LinkedIn 페이지를 방문하여 자유롭게 대화를 시작해 보세요. 또한 ChatGPT를 사용하여 문서 분석기 구축 및 OpenAI의 미세 조정 API를 사용하여 도메인 전문가 LLM 생성 에 대한 내용을 포함하여 이전 LLM 기사를 자유롭게 읽어보세요.
즐거운 해킹되세요!