제퍼넷 로고

Amazon SageMaker JumpStart에서 코드 Llama 미세 조정 | 아마존 웹 서비스

시간

오늘 우리는 Meta를 사용하여 Code Llama 모델을 미세 조정하는 기능을 발표하게 되어 기쁘게 생각합니다. Amazon SageMaker 점프스타트. LLM(대형 언어 모델)의 Code Llama 제품군은 7억에서 70억 개의 매개변수 범위에 이르는 사전 훈련되고 미세 조정된 코드 생성 모델 모음입니다. 미세 조정된 Code Llama 모델은 기본 Code Llama 모델에 비해 더 나은 정확성과 설명 가능성을 제공합니다. 인간평가 및 MBPP 데이터 세트. 다음을 사용하여 SageMaker JumpStart로 Code Llama 모델을 미세 조정하고 배포할 수 있습니다. 아마존 세이지 메이커 스튜디오 몇 번의 클릭만으로 UI를 만들거나 SageMaker Python SDK를 사용할 수 있습니다. Llama 모델의 미세 조정은 다음에서 제공되는 스크립트를 기반으로 합니다. 라마 레시피 GitHub 저장소 PyTorch FSDP, PEFT/LoRA 및 Int8 양자화 기술을 사용하여 Meta에서.

이 게시물에서는 다음에서 사용할 수 있는 원클릭 UI 및 SDK 환경을 통해 SageMaker JumpStart를 통해 Code Llama 사전 훈련된 모델을 미세 조정하는 방법을 안내합니다. GitHub 저장소.

SageMaker JumpStart란?

SageMaker JumpStart를 사용하면 기계 학습(ML) 실무자는 공개적으로 사용 가능한 다양한 기초 모델 중에서 선택할 수 있습니다. ML 실무자는 기초 모델을 전용 모델에 배포할 수 있습니다. 아마존 세이지 메이커 네트워크 격리 환경에서 인스턴스를 생성하고 모델 교육 및 배포를 위해 SageMaker를 사용하여 모델을 사용자 지정합니다.

코드 라마란?

Code Llama는 코드 전문 버전입니다. 라마 2 이는 코드별 데이터 세트에 대해 Llama 2를 추가로 교육하고 동일한 데이터 세트에서 더 많은 데이터를 더 오랫동안 샘플링하여 생성되었습니다. Code Llama는 향상된 코딩 기능을 제공합니다. 코드와 자연어 프롬프트 모두에서 코드와 코드에 대한 자연어를 생성할 수 있습니다(예: "피보나치 수열을 출력하는 함수를 작성해 주세요"). 코드 완성 및 디버깅에도 사용할 수 있습니다. Python, C++, Java, PHP, Typescript(JavaScript), C#, Bash 등을 포함하여 오늘날 사용되는 가장 널리 사용되는 프로그래밍 언어를 대부분 지원합니다.

Code Llama 모델을 미세 조정하는 이유

Meta는 다음에 대한 Code Llama 성능 벤치마크를 게시했습니다. HumanEval 및 MBPP Python, Java, JavaScript와 같은 일반적인 코딩 언어용입니다. HumanEval에서 Code Llama Python 모델의 성능은 38B Python 모델의 7%에서 57B Python 모델의 70%에 이르는 다양한 코딩 언어 및 작업에 걸쳐 다양한 성능을 보여주었습니다. 또한 SQL 프로그래밍 언어에서 미세 조정된 Code Llama 모델은 SQL 평가 벤치마크에서 명백히 알 수 있듯이 더 나은 결과를 보여주었습니다. 공개된 이러한 벤치마크는 Code Llama 모델을 미세 조정하여 특정 코딩 도메인 및 작업에 대한 더 나은 성능, 사용자 정의 및 적응을 가능하게 하는 잠재적인 이점을 강조합니다.

SageMaker Studio UI를 통한 코드 없이 미세 조정

SageMaker Studio를 사용하여 Llama 모델 미세 조정을 시작하려면 다음 단계를 완료하십시오.

  1. SageMaker Studio 콘솔에서 다음을 선택합니다. 점프 시작 탐색 창에서

오픈 소스 모델부터 독점 모델까지 350개 이상의 모델 목록을 찾을 수 있습니다.

  1. Code Llama 모델을 검색해 보세요.

Code Llama 모델이 표시되지 않으면 종료했다가 다시 시작하여 SageMaker Studio 버전을 업데이트할 수 있습니다. 버전 업데이트에 대한 자세한 내용은 다음을 참조하세요. Studio 앱 종료 및 업데이트. 다음을 선택하여 다른 모델 변형을 찾을 수도 있습니다. 모든 코드 생성 모델 살펴보기 또는 검색창에 Code Llama를 검색해 보세요.

SageMaker JumpStart는 현재 Code Llama 모델에 대한 명령 미세 조정을 지원합니다. 다음 스크린샷은 Code Llama 2 70B 모델의 미세 조정 페이지를 보여줍니다.

  1. 럭셔리 교육 데이터 세트 위치, 다음을 가리킬 수 있습니다. 아마존 단순 스토리지 서비스 (Amazon S3) 미세 조정을 위한 훈련 및 검증 데이터 세트가 포함된 버킷입니다.
  2. 미세 조정을 위해 배포 구성, 하이퍼파라미터, 보안 설정을 설정하세요.
  3. 왼쪽 메뉴에서 Train SageMaker ML 인스턴스에서 미세 조정 작업을 시작합니다.

다음 섹션에서는 명령어 미세 조정을 위해 준비하는 데 필요한 데이터 세트 형식에 대해 논의합니다.

  1. 모델을 미세 조정한 후 SageMaker JumpStart의 모델 페이지를 사용하여 배포할 수 있습니다.

다음 스크린샷과 같이 미세 조정이 완료되면 미세 조정된 모델을 배포하는 옵션이 나타납니다.

SageMaker Python SDK를 통해 미세 조정

이 섹션에서는 명령 형식의 데이터 세트에서 SageMaker Python SDK를 사용하여 Code LIama 모델을 미세 조정하는 방법을 보여줍니다. 특히 모델은 지침을 사용하여 설명된 일련의 자연어 처리(NLP) 작업에 맞게 미세 조정되었습니다. 이는 제로샷 프롬프트를 통해 보이지 않는 작업에 대한 모델 성능을 향상시키는 데 도움이 됩니다.

미세 조정 작업을 완료하려면 다음 단계를 완료하세요. 전체 미세 조정 코드는 다음에서 얻을 수 있습니다. GitHub 저장소.

먼저 명령어 미세 조정에 필요한 데이터 세트 형식을 살펴보겠습니다. 학습 데이터는 JSON 라인(.jsonl) 형식으로 지정되어야 하며, 여기서 각 라인은 데이터 샘플을 나타내는 사전입니다. 모든 학습 데이터는 단일 폴더에 있어야 합니다. 그러나 여러 .jsonl 파일에 저장할 수 있습니다. 다음은 JSON 라인 형식의 샘플입니다.

{
	'system_prompt': 'a chat',
	'question': 'Please focus on the efficiency of this problem and provide code in python:nYou are given two strings `s` and `t` consisting of only lowercase English letters.nnReturn _the minimum number of characters that need to be appended to the end of_ `s` _so that_ `t` _becomes a **subsequence** of_ `s`.nnA **subsequence** is a string that can be derived from another string by deleting some or no characters without changing the order of the remaining characters.nn**Example 1:**nn**Input:** s = "coaching ", t = "coding "n**Output:** 4n**Explanation:** Append the characters "ding " to the end of s so that s = "coachingding ".nNow, t is a subsequence of s ( "**co**aching**ding** ").nIt can be shown that appending any 3 characters to the end of s will never make t a subsequence.nn**Example 2:**nn**Input:** s = "abcde ", t = "a "n**Output:** 0n**Explanation:** t is already a subsequence of s ( "**a**bcde ").nn**Example 3:**nn**Input:** s = "z ", t = "abcde "n**Output:** 5n**Explanation:** Append the characters "abcde " to the end of s so that s = "zabcde ".nNow, t is a subsequence of s ( "z**abcde** ").nIt can be shown that appending any 4 characters to the end of s will never make t a subsequence.nn**Constraints:**nn* `1 <= s.length, t.length <= 105`n* `s` and `t` consist only of lowercase English letters.',
	'response': '### Explanationn The algorithm maintains two pointers, `i` and `j`, to iterate through the given strings `s` and `t`. The pointer `i` iterates through the string `s` and the pointer `j` iterates through the string `t`. While iterating through `s`, if we find a character that matches the current character in `t`, we increment the `j` pointer. This is because the matched character can be a part of the subsequence we are looking for. The iteration stops when either `i` reaches the end of `s` or `j` reaches the end of `t`.nnAt the end, we subtract the index `j` from the length of `t`. This gives us the minimum number of characters that need to be appended to the end of `s` so that `t` becomes a subsequence of `s`.nn### Pseudocode:n```nMIN-ADDITION(s, t)n s_len = LENGTH(s)n t_len = LENGTH(t)n i = 1n j = 1n WHILE i <= s_len AND j <= t_lenn IF s[i] == t[j]n j = j + 1n ENDIFn i = i + 1n ENDWHILEn RETURN t_len - j + 1nENDMIN-ADDITIONn```nn### Coden```pythonndef min_addition(s: str, t: str) -> int:n s_len = len(s)n t_len = len(t)n i, j = 0, 0n while i < s_len and j < t_len:n if s[i] == t[j]:n j += 1n i += 1n return t_len - jn```n'
}

훈련 폴더에는 다음이 포함될 수 있습니다. template.json 입력 및 출력 형식을 설명하는 파일입니다. 다음은 예제 템플릿입니다.

{
    "prompt": "{system_prompt} ### Input: {question}",
    "completion": "{response}"
}

템플릿과 일치하려면 JSON 라인 파일의 각 샘플에 다음이 포함되어야 합니다. system_prompt, questionresponse 필드. 이 데모에서는 돌핀 코더 데이터 세트 허깅 페이스에서.

데이터 세트를 준비하고 S3 버킷에 업로드한 후 다음 코드를 사용하여 미세 조정을 시작할 수 있습니다.

from sagemaker.jumpstart.estimator import JumpStartEstimator

model_id = "meta-textgeneration-llama-codellama-7b" 
model_version = "*"
train_data_location = f"s3://{your_own_bucket_hosting_training_data}/" # training data in s3 bucket

estimator = JumpStartEstimator(
    model_id=model_id,
    model_version=model_version,
    hyperparameters= hyperparameters,
    environment={
        "accept_eula": "false"
    },  # please change `accept_eula` to be `true` to accept EULA.
)

estimator.fit({"training": train_data_location})

다음 코드에 표시된 대로 추정기에서 직접 미세 조정된 모델을 배포할 수 있습니다. 자세한 내용은 수첩을 참조하세요. GitHub 저장소.

finetuned_predictor = estimator.deploy()

미세 조정 기술

Llama와 같은 언어 모델의 크기는 10GB 이상, 심지어 100GB 이상입니다. 이러한 대규모 모델을 미세 조정하려면 상당히 높은 CUDA 메모리를 갖춘 인스턴스가 필요합니다. 게다가, 이러한 모델을 훈련하는 것은 모델의 크기로 인해 매우 느릴 수 있습니다. 따라서 효율적인 미세 조정을 위해 다음과 같은 최적화를 사용합니다.

  • 낮은 순위 적응(LoRA) – 대형 모델의 효율적인 미세 조정을 위한 PEFT(Parameter Efficient Fine-Tuning)의 일종입니다. 이 방법을 사용하면 전체 모델을 동결하고 조정 가능한 작은 매개변수 또는 레이어 세트만 모델에 추가할 수 있습니다. 예를 들어 Llama 7 2B의 경우 7억 개의 매개변수를 모두 훈련하는 대신 매개변수의 1% 미만을 미세 조정할 수 있습니다. 이는 매개변수의 1%에 대해서만 그라데이션, 최적화 상태 및 기타 교육 관련 정보를 저장하면 되므로 메모리 요구 사항을 크게 줄이는 데 도움이 됩니다. 또한 이는 교육 시간과 비용을 줄이는 데 도움이 됩니다. 이 방법에 대한 자세한 내용은 다음을 참조하세요. LoRA: 대규모 언어 모델의 낮은 순위 적응.
  • Int8 양자화 – LoRA와 같은 최적화를 적용하더라도 Llama 70B와 같은 모델은 여전히 ​​학습하기에는 너무 큽니다. 훈련 중에 메모리 사용량을 줄이려면 훈련 중에 Int8 양자화를 사용할 수 있습니다. 양자화는 일반적으로 부동 소수점 데이터 유형의 정밀도를 감소시킵니다. 이렇게 하면 모델 가중치를 저장하는 데 필요한 메모리가 줄어들지만 정보 손실로 인해 성능이 저하됩니다. Int8 양자화는 8/XNUMX 정밀도만 사용하지만 단순히 비트를 삭제하는 것이 아니기 때문에 성능 저하가 발생하지 않습니다. 데이터를 한 유형에서 다른 유형으로 반올림합니다. IntXNUMX 양자화에 대해 알아보려면 다음을 참조하세요. LLM.int8(): 대규모 변환기를 위한 8비트 행렬 곱셈.
  • 완전 샤딩 데이터 병렬(FSDP) – 이는 모델의 매개변수를 데이터 병렬 작업자 간에 분할하고 선택적으로 훈련 계산의 일부를 CPU로 오프로드할 수 있는 일종의 데이터 병렬 훈련 알고리즘입니다. 매개변수는 서로 다른 GPU에 걸쳐 분할되지만 각 마이크로배치의 계산은 GPU 작업자에 따라 로컬로 수행됩니다. 매개변수를 보다 균일하게 분할하고 훈련 중 통신 및 계산 중첩을 통해 최적화된 성능을 달성합니다.

다음 표에는 설정이 다른 각 모델의 세부 정보가 요약되어 있습니다.

모델 기본 설정 로라 + FSDP LORA + FSDP 없음 Int8 양자화 + LORA + FSDP 없음
코드 라마 2 7B 로라 + FSDP 가능 가능 가능
코드 라마 2 13B 로라 + FSDP 가능 가능 가능
코드 라마 2 34B INT8 + LORA + FSDP 없음 아니 아니 가능
코드 라마 2 70B INT8 + LORA + FSDP 없음 아니 아니 가능

Llama 모델의 미세 조정은 다음에서 제공하는 스크립트를 기반으로 합니다. GitHub 레포.

훈련에 지원되는 하이퍼파라미터

Code Llama 2 미세 조정은 다양한 하이퍼 매개변수를 지원하며 각 매개변수는 미세 조정 모델의 메모리 요구 사항, 훈련 속도 및 성능에 영향을 미칠 수 있습니다.

  • 시대 – 미세 조정 알고리즘이 교육 데이터 세트를 통과하는 패스 수입니다. 1보다 큰 정수여야 합니다. 기본값은 5입니다.
  • 학습_속도 – 각 훈련 예제 배치를 처리한 후 모델 가중치가 업데이트되는 속도입니다. 0보다 큰 양수 부동 소수점이어야 합니다. 기본값은 1e-4입니다.
  • Instruction_tuned – 모델을 교육할 것인지 여부. 반드시 True or False. 기본값은 False.
  • per_device_train_batch_size – 훈련을 위한 GPU 코어/CPU당 배치 크기입니다. 양의 정수여야 합니다. 기본값은 4입니다.
  • per_device_eval_batch_size – 평가를 위한 GPU 코어/CPU당 배치 크기입니다. 양의 정수여야 합니다. 기본값은 1입니다.
  • max_train_samples – 디버깅 목적 또는 빠른 교육을 위해 교육 예제 수를 이 값으로 자릅니다. 값 -1은 모든 훈련 샘플을 사용함을 의미합니다. 양의 정수 또는 -1이어야 합니다. 기본값은 -1입니다.
  • max_val_samples – 디버깅 목적이나 빠른 교육을 위해 검증 예제 수를 이 값으로 자릅니다. 값 -1은 모든 검증 샘플을 사용함을 의미합니다. 양의 정수 또는 -1이어야 합니다. 기본값은 -1입니다.
  • 최대 입력_길이 – 토큰화 후 최대 총 입력 시퀀스 길이. 이보다 긴 시퀀스는 잘립니다. -1이면, max_input_length 최소값 1024와 토크나이저에서 정의한 최대 모델 길이로 설정됩니다. 양수 값으로 설정하면 max_input_length 제공된 값의 최소값으로 설정되며 model_max_length 토크나이저에 의해 정의됩니다. 양의 정수 또는 -1이어야 합니다. 기본값은 -1입니다.
  • 검증_분할_비율 – 검증 채널이 다음과 같은 경우 none, 열차 데이터에서 열차 검증 분할 비율은 0-1 사이여야 합니다. 기본값은 0.2입니다.
  • train_data_split_seed – 검증 데이터가 없는 경우 입력 훈련 데이터를 알고리즘에서 사용하는 훈련 및 검증 데이터로 무작위로 분할하는 문제가 수정됩니다. 정수여야 합니다. 기본값은 0입니다.
  • preprocessing_num_workers – 전처리에 사용할 프로세스 수입니다. 만약에 None, 주요 프로세스는 전처리에 사용됩니다. 기본값은 None.
  • lora_r – Lora R. 양의 정수여야 합니다. 기본값은 8입니다.
  • lora_alpha – 로라 알파. 양의 정수여야 합니다. 기본값은 32입니다.
  • lora_dropout – 로라 드롭아웃. 0과 1 사이의 양수 부동 소수점이어야 합니다. 기본값은 0.05입니다.
  • int8_양자화 - 만약 True, 모델은 훈련을 위해 8비트 정밀도로 로드됩니다. 7B 및 13B의 기본값은 다음과 같습니다. False. 70B의 기본값은 True.
  • 활성화_fsdp – True인 경우 교육에서는 FSDP를 사용합니다. 7B 및 13B의 기본값은 True입니다. 70B의 기본값은 False입니다. 참고하세요 int8_quantization FSDP에서는 지원되지 않습니다.

하이퍼파라미터를 선택할 때 다음 사항을 고려하세요.

  • 환경 int8_quantization=True 메모리 요구 사항이 줄어들고 더 빠른 훈련이 가능해집니다.
  • 감소 per_device_train_batch_sizemax_input_length 메모리 요구 사항이 줄어들므로 더 작은 인스턴스에서 실행할 수 있습니다. 그러나 매우 낮은 값을 설정하면 훈련 시간이 늘어날 수 있습니다.
  • Int8 양자화를 사용하지 않는 경우(int8_quantization=False), FSDP(enable_fsdp=True) 더 빠르고 효율적인 훈련을 위해.

훈련에 지원되는 인스턴스 유형

다음 표에는 다양한 모델 훈련에 지원되는 인스턴스 유형이 요약되어 있습니다.

모델 기본 인스턴스 유형 지원되는 인스턴스 유형
코드 라마 2 7B ml.g5.12xlarge

ml.g5.12xlarge,

ml.g5.24xlarge,

ml.g5.48xlarge,

ml.p3dn.24xlarge,

ml.g4dn.12xlarge

코드 라마 2 13B ml.g5.12xlarge

ml.g5.24xlarge,

ml.g5.48xlarge,

ml.p3dn.24xlarge,

ml.g4dn.12xlarge

코드 라마 2 70B ml.g5.48xlarge

ml.g5.48xlarge

ml.p4d.24xlarge

인스턴스 유형을 선택할 때 다음을 고려하십시오.

  • G5 인스턴스는 지원되는 인스턴스 유형 중에서 가장 효율적인 교육을 제공합니다. 따라서 사용 가능한 G5 인스턴스가 있으면 이를 사용해야 합니다.
  • 훈련 시간은 GPU 수와 사용 가능한 CUDA 메모리 양에 따라 크게 달라집니다. 따라서 동일한 수의 GPU(예: ml.g5.2xlarge 및 ml.g5.4xlarge)를 사용하는 인스턴스에 대한 교육은 거의 동일합니다. 따라서 훈련에는 더 저렴한 인스턴스(ml.g5.2xlarge)를 사용할 수 있습니다.
  • p3 인스턴스를 사용하는 경우 bfloat32이 해당 인스턴스에서 지원되지 않으므로 교육은 16비트 정밀도로 수행됩니다. 따라서 훈련 작업은 g3 인스턴스에 비해 p5 인스턴스에서 훈련할 때 CUDA 메모리 양을 두 배로 소비합니다.

인스턴스당 훈련 비용에 대해 알아보려면 다음을 참조하세요. Amazon EC2 G5 인스턴스.

평가

평가는 미세 조정된 모델의 성능을 평가하는 중요한 단계입니다. 우리는 미세 조정되지 않은 모델에 비해 미세 조정된 모델의 개선을 보여주기 위해 정성적 및 정량적 평가를 모두 제시합니다. 정성적 평가에서는 미세 조정된 모델과 미세 조정되지 않은 모델 모두의 응답 예시를 보여줍니다. 정량적 평가에서는 다음을 사용합니다. 인간평가, 정확하고 정확한 결과를 생성하는 능력을 테스트하기 위해 Python 코드를 생성하기 위해 OpenAI에서 개발한 테스트 모음입니다. HumanEval 저장소는 MIT 라이센스를 따릅니다. 우리는 다양한 크기에 걸쳐 모든 Code LIama 모델의 Python 변형을 미세 조정했습니다(코드 LIama Python 7B, 13B, 34B 및 70B는 돌핀 코더 데이터 세트), 평가 결과를 다음 섹션에 제시합니다.

정성평가

미세 조정된 모델이 배포되면 엔드포인트를 사용하여 코드를 생성할 수 있습니다. 다음 예에서는 테스트 샘플에 대한 기본 및 미세 조정된 Code LIama 34B Python 변형의 응답을 제시합니다. 돌핀 코더 데이터 세트:

alpaca_format = """{system_prompt}

### Input:
{question}

### Response:n"""

system="You are a coding AI"
prompt = """Please explain the reasoning behind the following solution and 
provide code in python: Given a string `s`, return the longest palindromic 
substring in `s`. **Example 1:** **Input:** s = "babad " **Output:** "bab " 
**Explanation:** "aba " is also a valid answer. **Example 2:** 
**Input:** s = "cbbd " **Output:** "bb " 
**Constraints:** * `1 <= s.length <= 1000` * `s` consist of only digits 
and English letters."""

payload = json.dumps({
    "inputText": alpaca_format.format(system_prompt=system, question=prompt),
    "textGenerationConfig": {
    "maxTokenCount": 2048,
    "temperature":0.2
}})

finetuned_response = finetuned_predictor.predict(payload)
finetuned_response["generated_text"]

미세 조정된 Code Llama 모델은 이전 쿼리에 대한 코드를 제공하는 것 외에도 접근 방식에 대한 자세한 설명과 의사 코드를 생성합니다.

코드 Llama 34b Python 미세 조정되지 않은 응답:

### Code
def longestPalindrome(s):
    # Fill this in.
    longest = ""
    for i in range(len(s)):
        for j in range(len(s), i, -1):
            if len(longest) >= j-i:
                break
            elif s[i:j] == s[i:j][::-1]:
                longest = s[i:j]
                break
    return longest

print(longestPalindrome("abaxyzzyxf"))
# axyzzyx
###Reference:
- [https://www.geeksforgeeks.org/longest-palindrome-substring-set-1/]
(https://www.geeksforgeeks.org/longest-palindrome-substring-set-1/)

코드 Llama 34B Python 미세 조정 응답

### Explanation
The algorithm uses dynamic programming to find the longest palindromic substring. 
It initializes a 2D boolean table `dp` with the same dimensions as the input string `s`. 
The `dp[i][j]` value is set to `true` if the substring from index `i` to index `j` is a palindrome.

The algorithm then iterates through the string in a nested loop, starting from the first character to the last. 
It checks if the substring from index `i` to index `j` is a palindrome. 
If it is, it sets the `dp[i][j]` value to `true`. 
If the substring is of length 2 or 3, it sets the `dp[i][j]` value to `true` as well.

After the nested loop, the algorithm iterates through the `dp` table to find the longest palindromic substring. 
It keeps track of the maximum length and the starting and ending indices of the substring.

Finally, the algorithm returns the substring from the starting index to the ending index.

### Code
```python
def longestPalindrome(s: str) -> str:
    n = len(s)
    dp = [[False] * n for _ in range(n)]

    for i in range(n):
        dp[i][i] = True
        if i + 1 < n:
            dp[i][i + 1] = s[i] == s[i + 1]

    max_len = 1
    start = 0
    end = 0

    for i in range(n - 1):
        for j in range(i + 1, n):
            if j - i == 1 or dp[i + 1][j - 1]:
                dp[i][j] = s[i] == s[j]
                if j - i + 1 > max_len:
                    max_len = j - i + 1
                    start = i
                    end = j

    return s[start:end + 1]
```

지상 진실

### Explanation 
1. Initialize `start` and `maxLength` for result substring. 
2. Iterate through the given string `s` using the index `i`. 
3. For each index `i`, create two pointers `l` and `r` starting at `i`. 
4. Check if there's a consecutive sequence of identical characters, increment the right pointer `r` until the end of the sequence is reached. 
5. Update the index `i` to the current value of `r`. 
6. Expand the pointers `l` and `r` outwards to find the longest palindromic substring, checking that characters on both sides are equal. 
7. If the current length of the substring is greater than `maxLength`, update `start` and `maxLength`. 
8. Return the longest palindromic substring using the `start` and `maxLength`. 

### Code 
```python 
def longest_palindromic_substring(s: str) → str:
    n = len(s)
    if n == 0:
        return ""
    
    start, max_length = 0, 1
    for i in range(n):
        l, r = i, i
        while r < n - 1 and s[r] == s[r + 1]:
            r += 1
            i = r
        while l > 0 and r < n - 1 and s[l - 1] == s[r + 1]:
            l -= 1
            r += 1
        length = r - l + 1
        if length > max_length:
            start, max_length = l, length
    return s[start:start + max_length]
```

흥미롭게도, Code Llama 34B Python의 미세 조정 버전은 가장 긴 회문 부분 문자열에 대한 동적 프로그래밍 기반 솔루션을 제공하는데, 이는 선택한 테스트 예제의 Ground Truth에서 제공되는 솔루션과 다릅니다. 우리의 미세 조정된 모델은 동적 프로그래밍 기반 솔루션을 자세히 설명하고 설명합니다. 반면에, 미세 조정되지 않은 모델은 직후에 잠재적인 출력을 환각적으로 나타냅니다. print 명령문(왼쪽 셀에 표시)은 출력이 axyzzyx 주어진 문자열에서 가장 긴 회문이 아닙니다. 시간 복잡도 측면에서 동적 프로그래밍 솔루션은 일반적으로 초기 접근 방식보다 낫습니다. 동적 프로그래밍 솔루션의 시간 복잡도는 O(n^2)입니다. 여기서 n은 입력 문자열의 길이입니다. 이는 2차 시간 복잡도가 O(n^XNUMX)이지만 덜 최적화된 접근 방식을 사용하는 미세 조정되지 않은 모델의 초기 솔루션보다 더 효율적입니다.

이것은 유망 해 보입니다! 기억하세요. 우리는 Code LIama Python 변형을 10%의 비율로 미세 조정했습니다. 돌핀 코더 데이터 세트. 탐험할 것이 더 많이 있습니다!

응답에 대한 철저한 지침에도 불구하고 솔루션에 제공된 Python 코드의 정확성을 검사해야 합니다. 다음으로 우리는 평가 프레임워크를 사용합니다. 인간 평가 Code LIama에서 생성된 응답에 대해 통합 테스트를 실행하여 품질을 체계적으로 검사합니다.

HumanEval을 이용한 정량적 평가

HumanEval은 논문에 설명된 대로 Python 기반 코딩 문제에 대한 LLM의 문제 해결 능력을 평가하기 위한 평가 도구입니다. 코드로 훈련된 대규모 언어 모델 평가. 특히 함수 서명, 독스트링, 본문, 단위 테스트와 같은 제공된 정보를 기반으로 코드를 생성하는 언어 모델의 능력을 평가하는 164개의 원본 Python 기반 프로그래밍 문제로 구성됩니다.

각 Python 기반 프로그래밍 질문에 대해 SageMaker 엔드포인트에 배포된 Code LIama 모델로 보내 k개의 응답을 얻습니다. 다음으로 HumanEval 저장소의 통합 테스트에서 k개의 응답을 각각 실행합니다. k개의 응답 중 하나라도 통합 테스트를 통과하면 해당 테스트 케이스가 성공한 것으로 간주됩니다. 그렇지 않으면 실패합니다. 그런 다음 성공 사례의 비율을 최종 평가 점수로 계산하는 과정을 반복합니다. pass@k. 표준 관행에 따라 평가에서 k를 1로 설정하여 질문당 하나의 응답만 생성하고 통합 테스트를 통과하는지 테스트합니다.

다음은 HumanEval 저장소를 사용하기 위한 샘플 코드입니다. SageMaker 엔드포인트를 사용하여 데이터 세트에 액세스하고 단일 응답을 생성할 수 있습니다. 자세한 내용은 수첩을 참조하세요. GitHub 저장소.

%pip3 install human_eval
import json
from human_eval.evaluation import evaluate_functional_correctness
from human_eval.data import write_jsonl, read_problems
from tqdm import tqdm
problems = read_problems()

num_samples_per_task = 1 # value k: number of responses for each question
samples = [
    dict(task_id=task_id, completion=generate_one_completion(problems[task_id]["prompt"]))
    for task_id in tqdm(problems)
    for _ in range(num_samples_per_task)
]
write_jsonl("samples.jsonl", samples)

evaluate_functional_correctness('./samples.jsonl')

다음 표는 다양한 모델 크기에 걸쳐 미세 조정되지 않은 모델에 비해 미세 조정된 Code LIama Python 모델의 개선 사항을 보여줍니다. 정확성을 보장하기 위해 SageMaker 엔드포인트에 미세 조정되지 않은 Code LIama 모델을 배포하고 Human Eval 평가를 실행합니다. 그만큼 패스@1 숫자(다음 표의 첫 번째 행)는 보고된 숫자와 일치합니다. 코드 라마 연구 논문. 추론 매개변수는 다음과 같이 일관되게 설정됩니다. "parameters": {"max_new_tokens": 384, "temperature": 0.2}.

결과에서 볼 수 있듯이 모든 미세 조정된 Code LIama Python 변형은 미세 조정되지 않은 모델에 비해 상당한 개선을 보여줍니다. 특히 Code LIama Python 70B는 미세 조정되지 않은 모델보다 약 12% 정도 성능이 뛰어납니다.

. 7B 파이썬 13B 파이썬 34B 34B 파이썬 70B 파이썬
사전 훈련된 모델 성능(pass@1) 38.4 43.3 48.8 53.7 57.3
미세 조정된 모델 성능(pass@1) 45.12 45.12 59.1 61.5 69.5

이제 자신의 데이터 세트에서 Code LIama 모델을 미세 조정해 볼 수 있습니다.

정리

SageMaker 엔드포인트를 더 이상 실행하지 않기로 결정한 경우 다음을 사용하여 삭제할 수 있습니다. Python 용 AWS SDK (Boto3), AWS 명령 줄 인터페이스 (AWS CLI) 또는 SageMaker 콘솔. 자세한 내용은 다음을 참조하세요. 끝점 및 리소스 삭제. 또한 다음을 수행할 수 있습니다. SageMaker Studio 리소스 종료 더 이상 필요하지 않습니다.

결론

이 게시물에서는 SageMaker JumpStart를 사용하여 Meta의 Code Llama 2 모델을 미세 조정하는 방법에 대해 논의했습니다. SageMaker Studio 또는 SageMaker Python SDK의 SageMaker JumpStart 콘솔을 사용하여 이러한 모델을 미세 조정하고 배포할 수 있음을 보여주었습니다. 또한 미세 조정 기술, 인스턴스 유형 및 지원되는 하이퍼파라미터에 대해서도 논의했습니다. 또한, 우리가 실시한 다양한 테스트를 바탕으로 최적화된 교육에 대한 권장 사항을 간략하게 설명했습니다. 두 개의 데이터 세트에 대해 세 가지 모델을 미세 조정한 결과에서 볼 수 있듯이 미세 조정은 미세 조정되지 않은 모델에 비해 요약이 향상됩니다. 다음 단계에서는 GitHub 리포지토리에 제공된 코드를 사용하여 자신의 데이터 세트에서 이러한 모델을 미세 조정하여 사용 사례에 대한 결과를 테스트하고 벤치마킹할 수 있습니다.


저자에 관하여

황신 박사 Amazon SageMaker JumpStart 및 Amazon SageMaker 내장 알고리즘의 수석 응용 과학자입니다. 그는 확장 가능한 기계 학습 알고리즘 개발에 중점을 둡니다. 그의 연구 관심 분야는 자연어 처리, 테이블 형식 데이터에 대한 설명 가능한 딥 러닝, 비모수 시공간 클러스터링의 강력한 분석입니다. 그는 ACL, ICDM, KDD 컨퍼런스 및 왕립 통계 학회: 시리즈 A에서 많은 논문을 발표했습니다.

비샤알 얄라만찰리 초기 단계의 생성 AI, 로봇공학, 자율주행차 회사와 협력하는 스타트업 솔루션 설계자입니다. Vishaal은 고객과 협력하여 최첨단 ML 솔루션을 제공하며 강화 학습, LLM 평가 및 코드 생성에 개인적으로 관심이 있습니다. AWS 이전에 Vishaal은 UCI의 학부생으로 생물정보학 및 지능형 시스템에 중점을 두었습니다.

미낙시순다람 탄다바라얀 AWS에서 AI/ML 전문가로 일하고 있습니다. 그는 인간 중심의 데이터 및 분석 경험을 설계, 생성, 홍보하는 데 열정을 갖고 있습니다. Meena는 AWS의 전략적 고객에게 측정 가능하고 경쟁 우위를 제공하는 지속 가능한 시스템을 개발하는 데 중점을 두고 있습니다. Meena는 커넥터이자 디자인 사상가이며 혁신, 인큐베이션, 민주화를 통해 기업이 새로운 업무 방식을 추구하도록 노력하고 있습니다.

Ashish Khetan 박사 Amazon SageMaker 내장 알고리즘을 사용하는 수석 응용 과학자이며 기계 학습 알고리즘 개발을 돕습니다. 그는 University of Illinois Urbana-Champaign에서 박사 학위를 받았습니다. 그는 기계 학습 및 통계적 추론 분야에서 활동적인 연구원이며 NeurIPS, ICML, ICLR, JMLR, ACL 및 EMNLP 컨퍼런스에서 많은 논문을 발표했습니다.

spot_img

최신 인텔리전스

spot_img