Skip to main content

거래 전략을 위한 Weights & Biases 기반 Code Llama 미세 조정 가이드

Code Llama는 프로그래밍 코드를 생성하도록 특화된 고급 언어 모델로, 코드 자동완성, 디버깅, 그리고 처음부터 코드를 작성하는 기능을 제공합니다. AI 보조 코딩에서 의미 있는 도약을 이뤄 개발 워크플로를 더욱 효율화하고 복잡한 문제를 수월하게 해결할 수 있게 합니다. 이 글은 AI 번역 기사입니다. 오역 가능성이 있으면 댓글로 알려 주세요.
Created on September 15|Last edited on September 15
오늘은 코딩과 디버깅에 특화된 LLM인 Code Llama와 W&B를 함께 활용해 거래 전략을 정교화하는 방법을 살펴보겠습니다.

Code Llama 개요

일반적인 LLM과 달리, 코드 LLM은 자연어 처리와 소프트웨어 개발 사이의 간극을 메우도록 설계되었습니다. 이러한 발표가 이어지는 가운데, Code Llama메타가 공개한 최첨단 LLM으로, 코드 관련 작업에 초점을 맞추고 Llama 2 플랫폼을 기반으로 설계되었습니다. Code Llama는 코드 인필링에 뛰어나며, 프로그래밍 코드를 이해하고 생성하도록 파인튜닝되어 사용자 프롬프트에 따라 코드 자동완성, 디버깅, 심지어 처음부터 코드 작성까지 지원합니다.
Code Llama의 기본 버전에는 연산 자원이 제한된 환경에 적합한 소형·고효율 모델인 Code Llama 7B가 포함되어 있어 비교적 단순한 코딩 작업에 이상적입니다. 여기에 더해, 파라미터 규모가 크게 늘어난 Code Llama 34B는 코드 생성 능력이 크게 향상된 모델입니다.
가장 최근 이정표는 700억(70B) 파라미터 모델의 공개로, 해당 분야에서 새로운 기준을 제시했습니다. 이 모델은 여러 프로그래밍 언어에 대한 깊은 이해를 바탕으로 더 복잡한 질의를 처리하고, 맥락을 반영한 보다 정확한 제안을 제공합니다.
출처: 작성자

코드 LLM

코드 LLM은 사용자로부터 받은 프롬프트나 질문을 입력으로 받아들이고, 이를 프로그래밍 맥락에서 해석한 뒤, 방대한 프로그래밍 관련 데이터에서 학습한 패턴을 바탕으로 코드 스니펫이나 설명을 생성하는 방식으로 동작합니다.

코드 LLM은 어떻게 작동하나요?

코드 LLM은 토크나이즈, 임베딩, 트랜스포머 모델을 통한 처리, 토큰 단위 출력 생성 등 LLM에 공통적인 여러 단계를 거쳐 동작합니다.

토크나이즈

토크나이제이션은 코드와 같은 텍스트를 처리할 때 매우 중요한 전처리 단계입니다. 코드를 연산자, 식별자, 구문 등으로 이루어진 토큰 시퀀스로 변환해 모델이 이해할 수 있도록 하며, 이를 통해 다양한 프로그래밍 언어의 구조적 뉘앙스를 포착할 수 있게 합니다.

임베딩

코드가 토크나이즈되면, 각 토큰은 임베딩을 통해 고차원 벡터로 변환됩니다. 이러한 임베딩은 토큰의 의미적·구문적 정보를 담아, 모델이 프로그래밍 개념과 그 관계를 이해하도록 돕습니다. 임베딩은 학습 과정에서 습득됩니다. Code LLM은 일반 LLM에서 사용하는 절대적 위치 임베딩과 달리 회전 위치 임베딩을 사용합니다. 회전 위치 임베딩은 임베딩 공간에 회전을 적용해 위치 정보를 통합함으로써, 시퀀스에서 토큰 간 거리를 효과적으로 표현하고 요소들 사이의 관계를 더 잘 포착할 수 있게 합니다.

트랜스포머 모델

LLM은 일반적으로 어텐션 메커니즘을 갖춘 트랜스포머 아키텍처를 사용합니다. 이 메커니즘은 Code LLM이 출력을 생성할 때 코드의 관련 부분에 집중하도록 해 줍니다. 이는 어떤 변수가 참조되는지, 서로 다른 함수가 어떻게 상호작용하는지와 같은 코드 내 의존성을 이해하는 데 필수적입니다. 어텐션 메커니즘은 입력 문맥에 따라 모델의 집중 대상을 동적으로 조정하게 하여, 일관되고 문맥에 적합한 코드를 생성하는 능력을 향상합니다.


Code LLM의 성능은 학습 데이터의 양과 질에 크게 좌우됩니다. 이 모델은 공개 코드 저장소, 포럼, 문서 등 다양한 출처에서 수집한 방대한 코드 말뭉치로 학습됩니다. Llama 개발자들의 핵심 전략은 OpenAI 모델처럼 파라미터 수를 늘리는 대신, 초기 학습에 더 많은 데이터를 투입해 성능을 끌어올리는 것이었습니다. 이는 LLM의 지배적 비용이 학습 과정의 계산 비용보다 학습된 모델로 추론을 수행하는 비용에서 주로 발생한다는 판단에 따른 것입니다. 그 결과, 더 낮은 비용으로 운영할 수 있습니다.
또한, 코드 LLM은 활용합니다 SwiGLU GeLU 대신 학습 가능한 파라미터로 게이팅 메커니즘을 조절하는 활성화 함수를 사용합니다. 이 조정은 표준 GLU에 비해 더 다양한 게이팅 동작을 가능하게 하여, 일부 작업에서 성능 향상을 가져올 수 있습니다. 또한, 전통적인 LLM은 표준 레이어 정규화를 사용하는 반면, Code LLM은 RMSNorm(제곱평균 제곱근 기반 레이어 정규화)을 사용합니다.

AI 기반 코딩의 과제와 해결책

데이터 프라이버시와 보안

특히 클라우드 기반 AI 모델을 사용할 때 코드와 데이터의 보안을 보장하는 것은 매우 중요합니다. 민감한 정보가 유출될 수 있다는 우려가 있을 수 있습니다.

리소스 요구 사항

[[TRANSLATION_FAILED]]

적용 범위와 전문화

Llama 2와 같은 모델은 일반적인 언어 관련 작업에서 뛰어난 성능을 보이지만, 특수하거나 니치한 영역에 적용하면 효과가 크게 달라질 수 있습니다. 특정 도메인 요구 사항을 충족하려면 미세 조정이나 맞춤형 솔루션 개발이 필요할 수 있습니다.

모델 편향과 오류

Code Llama를 포함한 AI 모델은 학습 데이터에 기반해 편향되거나 부정확한 코드를 생성할 수 있으며, 이는 잠재적인 버그나 보안 취약점으로 이어질 수 있습니다.

설명 가능성과 투명성

Llama 2와 같은 대규모 언어 모델의 복잡성 때문에 의사 결정이나 출력이 어떻게 생성되는지에 대한 명확한 통찰을 얻기 어려운 경우가 많습니다. 특히 엄격한 규제를 받는 산업에서는 모델 출력에 대한 투명성과 설명 가능성을 확보하는 것이 필수적입니다.

Code Llama로 무엇을 할 수 있나요?

코드 생성 외에도 Code Llama는 자연어 지시를 이해하는 데 뛰어납니다. 즉, 개발자가 필요한 기능을 평이한 영어로 설명하면 Code Llama가 이를 동작하는 코드로 변환할 수 있습니다. Code Llama는 코드 자동 완성, 인필링, 대화형 지시와 같은 기능을 통해 코딩 생산성을 높입니다:
  • 코드 자동 완성: Code Llama는 기존 문맥을 바탕으로 다음에 올 코드 조각을 예측해 채워 주어, 코딩 과정을 간소화하고 타이핑 부담을 줄여 줍니다.
  • 인필링: 누락된 코드 조각을 지능적으로 채우거나 부분 코드 스니펫을 확장해 오류를 해결하고 코드 품질을 향상시킬 수 있습니다.
  • 대화형 지시: Code Llama는 자연어 지시를 해석해 동작하는 코드로 변환하여, 더 직관적이고 접근 가능한 코딩 경험을 제공합니다.
또한 Code Llama는 여러 프로그래밍 언어를 지원하여 다양한 개발 환경에서 활용할 수 있는 다재다능한 도구입니다. Python, JavaScript, Java 등 어떤 언어로 작업하든 Code Llama는 해당 언어에 맞는 코딩 솔루션을 제공하고, 언어별 관례를 준수하며, 모범 사례에 기반한 인사이트를 제시할 수 있습니다.

Python 및 지시 기반 코딩 작업을 위한 Code Llama 특화 모델의 중요성

또한 Code Llama에는 Base, Python, Instruct와 같은 특화 변형 모델이 있습니다. Base 모델은 다양한 프로그래밍 언어 전반에 걸친 폭넓은 코딩 작업을 처리할 수 있고, Python 모델은 파이썬 기반 작업에 초점을 맞춥니다. 마지막으로 Code Llama – Instruct는 자연어 지시를 따르고 이를 코드로 변환하도록 설계되었습니다. 이 모델은 특정 프로그래밍 문법에 익숙하지 않지만, 자연어로 달성하고자 하는 바를 설명할 수 있는 사용자에게 특히 유용합니다.
Code Llama – Instruct는 이러한 지시를 해석해 해당하는 코드를 생성하도록 학습되어 교육, 빠른 프로토타이핑, 비개발자와 소프트웨어 개발 간의 격차를 좁히는 데 유용한 도구입니다. 아래에서는 Code Llama 특화 파이프라인을 확인할 수 있으며, 미세 조정의 각 단계와 함께 학습 중에 처리된 토큰 수가 주석으로 표시되어 있습니다.

Weights & Biases와 함께 Code Llama 미세 조정

지정한 작업에 맞게 AI 모델을 최적화하려면, 먼저 사전 학습된 모델을 사용해 해당 작업에서의 성능을 검증할 수 있습니다. 결과가 만족스럽지 않은 경우, 관련 데이터셋으로 미세 조정을 수행해 성능을 향상시킬 수 있습니다.
아래에서는 유사한 사례로, 거래 전략 작업에 Code Llama 7B를 테스트해 보겠습니다. 이를 위해 퀀트 트레이딩 지시문 데이터셋을 사용합니다. 퀀트 트레이더의 역할은 수학적 계산을 활용하고 과거 금융 데이터를 분석하여 거래 기회를 식별하는 것입니다.
따라서 이 데이터셋에는 거래 전략을 분석하고 구축하는 코드 작성을 위한 사용자 질의(프롬프트)와 이에 대한 시스템의 코드 형태 응답이 포함되어 있습니다. 우리는 성능을 평가하고 포괄적인 워크플로를 유지하기 위해 W&B에서 분석 결과를 추적하겠습니다.

1. 라이브러리 임포트 및 W&B 설정

!pip install openai
from datetime import datetime
import os
import openai
import sys
import pandas as pd
import json
from IPython.display import Markdown, display
!pip install wandb
import wandb
wandb.init(project="together", name="togethercomputer/CodeLlama")

2. Together AI 설정

Hugging Face에서 제공하는 Code Llama는 GPT와 같은 OpenAI 모델처럼 API로 바로 접근할 수 없으므로, 추론과 미세 조정을 위해 로컬에 모델을 호스팅해야 합니다. 다만, 실험 용도로 모델을 테스트할 때 연산 자원이 제한된 환경을 고려하여 우리는 Together AITogether.ai는 이러한 모델을 호스팅하며, 비용이 거의 없거나 제한된 비용으로 API를 통해 손쉽게 접근할 수 있도록 지원합니다.
OpenAI 클래스의 객체에 전달할 together.ai API 키를 준비합니다.
os.environ["OPENAI_API_KEY"] = 'your_api_key'


client = openai.OpenAI(
api_key=os.environ.get("your_api_key"),
base_url="https://api.together.xyz/v1",
)


!pip install --upgrade together
import together
together.api_key = "your_api_key"

3. 사전 학습된 모델로 성능 평가

먼저 Code Llama 7B Instruct 모델을 로드하고, 제공된 사용자 컨텍스트를 바탕으로 코드를 생성하는 함수를 만듭니다. 또한 퀀트 프로그래머 역할을 수행하도록 시스템 컨텍스트도 함께 전달합니다.
results = []
def get_code_completion(user_content, base_model, model_name):
messages = [
{
"role": "system",
"content": "You are an expert quant programmer that helps to write Python trading strategies code based on the user request. Don't be too verbose.",
},
{
"role": "user",
"content": user_content,
}
]
response = client.chat.completions.create(
model=base_model,
messages=messages,
temperature=0.1
)


results.append({"user_prompt": user_content, str(model_name): response.choices[0].message.content})
return response.choices[0].message.content


base_model = "codellama/CodeLlama-7b-Instruct-hf"

다음으로, 백테스트용 코드를 작성하라는 사용자 프롬프트를 전달합니다. 출력 결과는 이 글의 마지막에서 분석합니다.
user_prompt = "Please write a Python script that performs a simple moving average (SMA) crossover trading strategy backtest."


chat_completion = get_code_completion(user_prompt, base_model, 'pretrained-7b')
print("Prompt:", user_prompt)
print("Completion:", chat_completion)

4. 데이터셋 불러오기 및 전처리

모델을 미세 조정하기 위해 퀀트 트레이딩 지시문 데이터셋을 로드합니다. 이 데이터는 질문, 컨텍스트, 그리고 코드 형태의 답변이라는 세 개의 열로 구성되어 있습니다.
!pip install datasets
from datasets import load_dataset
dataset = load_dataset('lumalik/Quant-Trading-Instruct')
그다음 사전을 pandas 데이터프레임으로 변환해 다루기 쉽게 만듭니다. 미세 조정을 위해 데이터의 앞부분, 즉 첫 100행만 사용합니다.
dataset_df = dataset['train'].to_pandas()
dataset_df_100 = dataset_df.iloc[:100]

5. 미세 조정을 위해 데이터를 JSON으로 변환하고 Together.ai에 업로드하기

아래에示된 7B 모델이 요구하는 형식은 여기에서 확인할 수 있습니다.
"""<s>[INST] <<SYS>> {context} <</SYS>> {question} [/INST] {answer} </s>"""
데이터프레임을 이 형식으로 변환한 뒤, 미세 조정을 위해 모델에 전달할 수 있도록 jsonl로 저장합니다. 형식은 여기에서 확인할 수 있습니다.
output_file_path = 'output_data1.jsonl'
instruct_template = \
"""<s>[INST] <<SYS>>\n{context}\n<</SYS>>\n\n{question} [/INST] {answer} </s>"""
with open(output_file_path, 'w') as file:
for index, row in dataset_df_100.iterrows():
formatted_text = instruct_template.format(
context=row['context'],
question=row['question'],
answer=row['answer']
)
json_object = {"text": formatted_text}
file.write(json.dumps(json_object) + '\n')
print(f"Data successfully written to {output_file_path}"
데이터셋의 형식이 표준을 따르는지 확인하려면 아래 코드를 사용해 검사할 수 있으며, 이때 is_passed_checked 값이 True여야 합니다.
resp = together.Files.check(file="/content/output_data1.jsonl")
print(resp)
그런 다음 데이터를 Together AI에 업로드합니다.
together.Files.upload(file="/content/output_data1.jsonl")

6. 모델을 미세 조정하고 결과를 W&B에 기록하기

이제 로드한 데이터의 파일 ID를 사용해 모델을 미세 조정할 수 있으며, W&B API 키를 전달해 결과를 W&B에 바로 기록할 수 있습니다.
resp = together.Finetune.create(
training_file = 'tarining_file_id',
model = 'togethercomputer/CodeLlama-7b-Instruct',
n_epochs = 5,
n_checkpoints = 1,
batch_size = 32,
learning_rate = 1e-5,
suffix = 'codeLlama-7b-finetune-trading',
wandb_api_key = ‘wandb API key’,
)
fine_tune_id = resp['id']

7. 미세 조정한 모델로 성능 평가하기

이제 미세 조정한 모델을 다음과 같이 로드할 수 있습니다:
finetuned_model = 'model_id_here'
model_list = together.Models.list()
print(f"{len(model_list)} models available")
available_model_names = [model_dict['name'] for model_dict in model_list]
finetuned_model in available_model_names
모델을 배포한 뒤, 다음을 사용해 추론에 사용할 수 있는지 확인합니다:
together.Models.start(finetuned_model)
together.Models.ready(finetuned_model)
이제 사전 학습된 모델에 사용했던 동일한 프롬프트를 반복해 실행한 뒤, 결과를 비교하겠습니다.
user_prompt = "Please write a Python script that performs a simple moving average (SMA) crossover trading strategy backtest."
chat_completion = get_code_completion(user_prompt, base_model, 'finetuned-7b')
print("Prompt:", user_prompt)
print("Completion:", chat_completion)
결과 코드는 참고용으로 W&B에 기록됩니다.
df_results = pd.DataFrame(results)
wandb.log({"results_table": wandb.Table(dataframe=df_results)})
W&B에 기록된 미세 조정 파라미터는 손실과 학습률이 이에 따라 감소했음을 보여줍니다.

출처: 작성자
아래에서는 사전 학습된 모델과 미세 조정한 모델의 기록된 결과를 비교할 수 있습니다. 비교해 보면 첫 번째 코드 스니펫은 포트폴리오 순자산에 대한 트레이딩 전략의 영향을 잘못 시뮬레이션하기 때문에 적절하지 않습니다. 매수나 매도 신호가 발생할 때마다 전체 순자산(100,000 단위)에 주가를 곧바로 곱하는데, 이는 일반적인 트레이딩 방식(포트폴리오 전체 가치에 주가를 곱하는 것이 아니라 일정 수량의 주식을 사고파는 방식)을 현실적으로 반영하지 못합니다. 이런 접근은 실제 거래 수량에 따른 포트폴리오 가치 변화를 정확히 추적하지 못하므로, 결과가 과장되거나 오해를 일으킬 수 있습니다.


결론

LLM의 등장은 효율성과 자동화의 지형을 획기적으로 바꾸어 놓았습니다. 이러한 혁신 가운데 Code Llama는 인공지능이 코딩 실무를 어떻게 도울 수 있는지를 보여 주는 대표적인 사례로 주목받고 있습니다. 코드 자동 완성, 인필링, 대화형 지시 해석에 특화된 기능을 통해 Code Llama는 코딩 과정을 더욱 효율적이고 손쉽게 만들며, 개발 방식에 혁신을 가져옵니다.
이 글에서는 특히 7B 버전의 Code Llama가 정량 트레이딩 전략의 백테스트를 수행하는 프로그래머 역할을 어떻게 수행하는지 살펴보았습니다. 사전 학습 모델과 미세 조정 모델을 비교한 실증적 사례를 통해, Code Llama를 미세 조정하면 특정 과업에 더 정확히 맞춘 응답을 제공하여 결과가 크게 개선될 수 있음을 확인했습니다. 전통적 프로그래밍에서 AI 보조 개발로의 전환은 이미 본격화되었으며, Code Llama와 같은 도구가 더 효율적이고 혁신적인 코딩의 미래를 선도하고 있습니다.

이 글은 AI가 번역한 기사입니다. 오역이 있을 경우 댓글로 알려 주세요. 원문 링크는 아래에서 확인하실 수 있습니다: 원문 보고서 보기