다음을 통해 공유


미세 조정을 사용하여 모델 사용자 지정

데이터 세트 및 사용 사례에 대해 Azure AI Foundry에서 Azure OpenAI 모델을 미세 조정하는 방법을 알아봅니다. 미세 조정을 사용하면 다음을 수행할 수 있습니다.

  • 프롬프트 엔지니어링에서 얻을 수 있는 것보다 더 높은 품질의 결과
  • 모델의 최대 요청 컨텍스트 제한에 맞을 수 있는 것보다 더 많은 예제를 학습하는 기능입니다.
  • 짧은 프롬프트로 인한 토큰 절약
  • 특히 더 작은 모델을 사용하는 경우 대기 시간 요청이 낮습니다.

몇 번의 학습과 달리 미세 조정은 프롬프트에 맞는 것보다 더 많은 예제를 학습시켜 모델을 향상시킵니다. 가중치가 작업에 맞게 조정되므로 예제나 지침이 적어 호출당 토큰을 줄이고 비용 및 대기 시간을 줄일 수 있습니다.

LoRA 또는 낮은 순위 적응을 사용하여 성능에 크게 영향을 주지 않고 복잡성을 줄이는 방식으로 모델을 미세 조정합니다. 이 방법은 원래의 상위 행렬을 낮은 순위의 행렬로 근사화하여 지도 학습 단계에서 중요한 매개 변수의 더 작은 하위 집합만 미세 조정하여 모델을 보다 관리하기 쉽고 효율적으로 만드는 방법으로 작동합니다. 사용자의 경우 이는 다른 기술보다 더 빠르고 저렴한 학습을 제공합니다.

이 문서에서는 다음 방법을 알아봅니다.

  • 포털, Python SDK 및 REST를 통해 미세 조정합니다.
  • 적절한 데이터 세트 및 형식을 선택합니다.
  • 작업 상태를 모니터링하고 결과를 가져옵니다.
  • 튜닝된 모델을 배포하고 평가합니다.
  • 평가 피드백에 따라 반복합니다.

Azure AI 파운드리 포털에는 두 가지 고유한 미세 조정 환경이 있습니다.

Azure OpenAI 모델만 미세 조정하는 경우 https://ai.azure.com/resource/overview로 이동하여 사용할 수 있는 Azure OpenAI 중심 미세 조정 환경을 권장합니다.

중요합니다

이 문서에 표시된 항목(미리 보기)은 현재 퍼블릭 미리 보기에서 확인할 수 있습니다. 이 미리 보기는 서비스 수준 계약 없이 제공되며, 프로덕션 워크로드에는 권장되지 않습니다. 특정 기능이 지원되지 않거나 기능이 제한될 수 있습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.

필수 조건

지원되는 모델

모델 페이지를 참조하여 현재 미세 조정을 지원하는 지역을 확인합니다.

또는 이전에 미세 조정된 모델을 base-model.ft-{jobid} 형식으로 미세 조정할 수 있습니다.

Azure AI 파운드리 포털의 워크플로 검토

Azure AI 파운드리 포털을 사용하기 위한 미세 조정 워크플로를 검토해 보세요.

  1. 학습 및 유효성 검사 데이터를 준비합니다.
  2. Azure AI Foundry 포털에서 미세 조정된 모델 만들기 대화 상자를 사용하여 사용자 지정 모델을 학습합니다.
    1. 학습 방법을 선택합니다.
    2. 기본 모델을 선택합니다.
    3. 학습 유형 선택
    4. 학습 데이터 선택.
    5. 필요에 따라 유효성 검사 데이터 선택.
    6. 선택적으로 미세 조정 작업에 대한 작업 매개 변수를 구성합니다.
    7. 필요에 따라 결과 사용자 지정 모델에 대해 자동 배포를 사용하도록 설정합니다 .
    8. 선택한 내용을 검토하고 새로운 사용자 지정 모델을 학습시킵니다.
  3. 사용자 지정 미세 조정된 모델의 상태를 확인합니다.
  4. 사용할 사용자 지정 모델을 배포합니다.
  5. 사용자 지정 모델을 사용합니다.
  6. 필요에 따라 사용자 지정 모델의 성능 및 적합성을 분석합니다.

학습 및 유효성 검사 데이터 준비

학습 데이터 및 유효성 검사 데이터 세트는 원하는 모델 성능에 대한 입력 및 출력 예제로 구성됩니다.

사용하는 학습 및 유효성 검사 데이터는 JSONL(JSON Lines) 문서 형식이어야 하며 채팅 완료 API에서 사용되는 대화 형식으로 서식을 지정해야 합니다.

일반적으로 모든 교육 예제에서 가장 잘 작동했음을 발견한 지침과 프롬프트를 사용하는 것이 좋습니다. 이는 특히 100개 미만의 예제가 있는 경우 최상의 결과를 얻는 데 도움이 됩니다.

예제 파일 형식

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

Azure OpenAI의 멀티 턴 채팅 파일 형식

jsonl 학습 파일의 한 줄에 여러 번 대화하는 것도 지원됩니다. 특정 도우미 메시지에 대한 미세 조정을 건너뛰려면 선택적 weight 키 값 쌍을 추가합니다. 현재 weight는 0 또는 1로 설정할 수 있습니다.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

비전을 통한 채팅 완료

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

JSONL 형식 외에도, 학습 및 유효성 검사 데이터 파일은 UTF-8로 인코딩되어야 하고 BOM(바이트 순서 표시)을 포함해야 합니다. 파일 크기는 512MB 미만이어야 합니다.

데이터 세트 크기 고려 사항

학습 사례가 많을수록 좋습니다. 10개 이상의 학습 예제가 없으면 미세 조정 작업이 진행되지 않지만 이러한 적은 수만으로는 모델 응답에 눈에 띄게 영향을 주지 않습니다. 성공하려면 수천 개는 아니더라도 수백 개의 학습 사례를 제공하는 것이 가장 좋습니다. 잘 만들어진 50개 학습 데이터로 시작하는 것이 좋습니다.

일반적으로 데이터 세트 크기가 두 배로 증가할 때마다 모델 품질이 선형적으로 증가할 수 있습니다. 그러나 저품질 예제는 성능에 부정적인 영향을 미칠 수 있습니다. 최고 품질의 예제에 대해서만 데이터 세트를 먼저 정리하지 않고 대량의 내부 데이터에서 모델을 학습하는 경우, 예상보다 훨씬 더 나쁜 성능을 발휘하는 모델이 될 수 있습니다.

미세 조정된 모델 만들기

Azure AI Foundry 포털은 미세 조정된 모델 만들기 대화 상자를 제공하므로 한 곳에서 Azure 리소스에 대해 미세 조정된 모델을 쉽게 만들고 학습할 수 있습니다.

  1. Azure AI Foundry 포털로 https://ai.azure.com/ 이동하여 Azure OpenAI 리소스에 액세스할 수 있는 자격 증명으로 로그인합니다. 로그인 워크플로 중에 적절한 디렉터리, Azure 구독 및 Azure OpenAI 리소스를 선택합니다.

  2. Azure AI 파운드리 포털에서 도구 >미세 조정 창으로 이동하여 모델 미세 조정을 선택합니다.

    Azure AI 파운드리 포털에서 사용자 지정 모델 만들기 마법사에 액세스하는 방법을 보여 주는 스크린샷.

  3. 미세 조정할 모델을 선택한 다음 다음 을 선택하여 계속합니다.

    Azure AI Foundry 포털의 모델 선택 대화 상자 스크린샷.

이제 미세 조정된 모델 만들기 대화 상자가 표시됩니다.

미세 조정된 모델 만들기 대화 상자의 스크린샷

학습 방법 선택

첫 번째 단계는 모델 선택 및 학습 방법을 확인하는 것입니다. 모든 모델이 모든 학습 방법을 지원하는 것은 아닙니다.

  • 감독되는 SFT(미세 조정): 모든 비이성 모델에서 지원됩니다.
  • DPO(직접 기본 설정 최적화)(미리 보기): GPT-4o에서 지원됩니다.
  • Reinforcement Fine Tuning(보강형 미세 조정) (미리 보기): RFT는 o4-mini와 같은 추론 모델에서 지원됩니다.

모델을 선택할 때 이전에 미세 조정된 모델을 선택할 수도 있습니다.

학습 형식 선택

미세 조정 작업에 사용할 학습 계층을 선택합니다.

  • 표준: 학습은 현재 Azure OpenAI 리소스의 지역에서 수행되어 데이터 상주를 제공합니다.
  • 글로벌(미리 보기): 토큰당 더 저렴한 교육은 데이터 상주를 제공하지 않습니다.

데이터 상주 요구 사항이 없는 경우 Global 은 현재 지역 이외의 학습 용량을 활용하는 것이 좋습니다. 공개 미리 보기에 있는 동안에는 현재 지역 내에서 전역 을 사용할 수 없습니다. 상의

경우에 따라 표준은 현재 지역 내에서 사용할 수 없습니다 . 데이터 보존이 필요한 경우 선택한 모델의 모델 가용성 에 나열된 지역을 참조하세요.

학습 데이터 선택

다음 단계는 기존 준비된 학습 데이터를 선택하거나 학습 데이터 추가를 선택하여 모델을 사용자 지정할 때 사용할 새 준비된 학습 데이터를 업로드하는 것입니다.

학습 데이터 대화 상자에는 이전에 업로드한 기존 데이터 세트가 표시되며 새 학습 데이터를 업로드하는 옵션도 제공됩니다.

Azure AI Foundry 포털에서 사용자 지정 모델 만들기 마법사의 학습 데이터 창 스크린샷

  • 학습 데이터가 서비스에 이미 업로드된 경우 연결된 AI 리소스에서 파일을 선택합니다.

    • 표시된 드롭다운 목록에서 파일을 선택합니다.
  • 새 학습 데이터를 업로드하려면 다음 옵션 중 하나를 사용합니다.

    • 로컬 파일에서 학습 데이터를 업로드하려면 파일 업로드 를 선택합니다.
    • Azure Blob 또는 다른 공유 웹 위치에서 학습 데이터를 가져오려면 Azure Blob 또는 다른 공유 웹 위치를 선택합니다.

대용량 데이터 파일의 경우 Azure Blob 저장소에서 가져오는 것이 좋습니다. 요청이 원자성이어서 다시 시도하거나 다시 시작할 수 없기 때문에 대용량 파일은 멀티파트 양식을 통해 업로드할 때 불안정해질 수 있습니다. Azure Blob Storage에 대한 자세한 내용은 Azure Blob Storage란?을 참조하세요.

비고

학습 데이터 파일은 JSONL 파일로 포맷되고 BOM(바이트 순서 표시)이 있는 UTF-8로 인코딩되어야 합니다. 파일 크기는 512MB 미만이어야 합니다.

유효성 검사 데이터 선택(선택 사항)

유효성 검사 데이터 세트가 있는 경우 학습 데이터 추가를 선택합니다. 기존 준비된 유효성 검사 데이터를 선택하거나 모델을 사용자 지정할 때 사용할 새 준비된 유효성 검사 데이터를 업로드할 수 있습니다.

유효성 검사 데이터 대화 상자에는 이전에 업로드한 기존 학습 및 유효성 검사 데이터 세트가 표시되고 새 유효성 검사 데이터를 업로드할 수 있는 옵션이 제공됩니다.

Azure AI Foundry 포털에서 사용자 지정 모델 만들기 마법사의 유효성 검사 데이터 창 스크린샷

  • 유효성 검사 데이터가 서비스에 이미 업로드된 경우 데이터 세트 선택을 선택합니다.

    • 유효성 검사 데이터 창에 표시된 목록에서 파일을 선택합니다.
  • 새 유효성 검사 데이터를 업로드하려면 다음 옵션 중 하나를 사용합니다.

    • 로컬 파일을 선택하여 로컬 파일에서 유효성 검사 데이터를 업로드합니다.
    • Azure Blob 또는 다른 공유 웹 위치에서 유효성 검사 데이터를 가져오려면 Azure Blob 또는 다른 공유 웹 위치를 선택합니다.

대용량 데이터 파일의 경우 Azure Blob 저장소에서 가져오는 것이 좋습니다. 요청이 원자성이어서 다시 시도하거나 다시 시작할 수 없기 때문에 대용량 파일은 멀티파트 양식을 통해 업로드할 때 불안정해질 수 있습니다.

비고

학습 데이터 파일과 마찬가지로, 유효성 검사 파일은 JSONL 파일로 포맷되고 BOM(바이트 순서 표시)이 있는 UTF-8로 인코딩되어야 합니다. 파일 크기는 512MB 미만이어야 합니다.

모델을 식별 가능하게 만들기(선택 사항)

또한 미세 조정된 suffix 모델의 여러 반복을 더 쉽게 구분할 수 있도록 매개 변수를 포함하는 것이 좋습니다. A suffix 는 최대 18자의 문자열을 사용하며 결과 미세 조정된 모델의 이름을 지정할 때 사용됩니다.

학습 매개 변수 구성(선택 사항)

선택적 시드 를 제공하고 추가 하이퍼 매개 변수를 튜닝할 수 있습니다.

시드는 작업의 재현성을 제어합니다. 동일한 시드 및 작업 매개 변수를 전달하면 동일한 결과가 생성되지만 드문 경우에 다를 수 있습니다. 시드가 지정되지 않으면 임의로 시드가 생성됩니다.

Azure AI Foundry 포털에서 사용자 지정 모델 만들기 마법사의 매개 변수 섹션 스크린샷을 닫습니다.

다음 하이퍼 매개 변수는 Azure AI Foundry 포털을 통해 튜닝할 수 있습니다.

이름 유형 설명
Batch 크기 integer 학습에 사용할 일괄 처리 크기입니다. 일괄 처리 크기는 단일 전진 및 후진 계산법을 학습하는 데 사용되는 학습 예의 수입니다. 일반적으로 일괄 처리 크기가 클수록 데이터 세트가 클수록 더 잘 작동하는 경향이 있습니다. 기본값과 이 속성의 최대값은 기본 모델과 관련이 있습니다. 일괄 처리 크기가 클수록 모델 매개 변수는 덜 자주 업데이트되지만 분산은 낮습니다.
학습 속도 승수 숫자 학습에 사용할 학습 속도 승수입니다. 미세 조정 학습 속도는 사전 학습에 사용된 원래 학습 속도에 이 값을 곱한 값입니다. 학습률이 클수록 일괄 처리 크기가 클수록 성능이 더 좋은 경향이 있습니다. 0.02에서 0.2 사이의 값으로 실험하여 최상의 결과를 생성하는 값을 확인하는 것이 좋습니다. 학습률이 작을수록 과잉 맞춤을 방지하는 데 유용할 수 있습니다.
에포크 수 integer 모델을 학습할 epoch 수입니다. Epoch는 학습 데이터 세트를 통한 하나의 전체 주기를 나타냅니다.

자동 배포 사용(선택 사항)

시간을 절약하기 위해 필요에 따라 결과 모델에 자동 배포를 사용하도록 설정할 수 있습니다. 학습이 성공적으로 완료되면 선택한 배포 유형을 사용하여 모델이 배포됩니다. 배포 이름은 사용자 지정 모델에 대해 생성된 고유한 이름과 이전에 제공했을 수 있는 선택적 접미사를 기반으로 합니다.

Azure AI Foundry 포털에서 사용자 지정 모델 만들기 마법사의 자동 배포 토글 스크린샷

비고

현재 자동 배포에는 전역 표준 및 개발자 배포만 지원됩니다. 이러한 옵션 중 어느 것도 데이터 상주를 제공하지 않습니다. 자세한 내용은 배포 유형 설명서를 참조하세요.

선택한 내용 검토 및 모델 학습

선택 사항을 검토하고 제출을 선택하여 새 미세 조정된 모델 학습을 시작합니다.

사용자 지정 모델 상태 확인

미세 조정 작업을 제출하면 미세 조정된 모델에 대한 세부 정보가 포함된 페이지가 표시됩니다. Azure AI Foundry 포털의 미세 조정 페이지에서 상태 및 미세 조정된 모델에 대한 자세한 정보를 찾을 수 있습니다.

사용자의 작업이 시스템의 다른 작업 뒤에 대기 중일 수 있습니다. 모델 및 데이터 세트 크기에 따라 모델을 학습하는 데 몇 분 또는 몇 시간이 걸릴 수 있습니다.

검사점

각 학습 epoch가 완료되면 검사점이 생성됩니다. 검사점은 후속 미세 조정 작업을 위한 대상 모델로 배포 및 사용할 수 있는 모델의 완전한 기능 버전입니다. 검사점은 과잉 맞춤이 발생하기 전에 스냅샷을 제공할 수 있으므로 특히 유용할 수 있습니다. 미세 조정 작업이 완료되면 배포할 수 있는 최신 모델 버전 3개가 제공됩니다.

일지 중지 및 다시 시작

AI 파운드리 포털의 두 가지 미세 조정 보기에서 진행률을 추적할 수 있습니다. 일반적인 미세 조정 작업과 동일한 상태(대기, 실행 중, 성공)로 작업이 진행되는 것을 볼 수 있습니다.

학습이 실행되는 동안 결과 파일을 검토하여 진행률과 학습이 예상대로 진행 중인지 여부를 확인할 수도 있습니다.

비고

학습하는 동안 로그 및 메트릭을 보고 필요에 따라 작업을 일시 중지할 수 있습니다. 일시 중지는 메트릭이 수렴되지 않거나 모델이 적절한 속도로 학습되지 않는다고 생각되는 경우에 유용할 수 있습니다. 학습 작업이 일시 중지되면 안전 평가가 완료되면 배포 가능한 검사점이 생성됩니다. 이 검사점은 추론을 위해 배포하고 사용하거나 작업이 완료될 때까지 작업을 재개하는 데 사용할 수 있습니다. 일시 중지 작업은 하나 이상의 단계에 대해 학습되고 실행 중 상태인 작업에만 적용됩니다.

강화 미세 조정 작업을 실행 중인 스크린샷.

사용자 지정 모델 분석

미세 조정 작업이 완료되면 Azure OpenAI는 results.csv라는 결과 파일을 각 미세 조정 작업에 연결합니다. 이 결과 파일을 사용하여 사용자 지정 모델의 학습 및 유효성 검사 성능을 분석할 수 있습니다. 각 사용자 지정 모델에 대한 결과 파일의 파일 ID는 Azure AI 파운드리 포털의 모델 창에 있는 결과 파일 ID 열에 나열됩니다. Azure AI 파운드리 포털의 데이터 파일 창에서 파일 ID를 사용하여 결과 파일을 식별하고 다운로드할 수 있습니다.

결과 파일은 미세 조정 작업에서 수행하는 각 학습 단계에 대한 머리글 행과 행을 포함하는 CSV 파일입니다. 결과 파일에는 다음 열이 포함되어 있습니다.

열 이름 설명
step 학습 단계의 수입니다. 학습 단계는 학습 데이터 일괄 처리에 대한 정방향 및 역방향 단일 패스를 나타냅니다.
train_loss 학습 일괄 처리의 손실입니다.
train_mean_token_accuracy 모델에서 올바르게 예측한 학습 일괄 처리의 토큰 비율입니다.
예를 들어 일괄 처리 크기가 3으로 설정되고 데이터에 완료 [[1, 2], [0, 5], [4, 2]]가 포함된 경우 모델이 [[1, 1], [0, 5], [4, 2]]를 예측하면 이 값은 0.83(5/6)으로 설정됩니다.
valid_loss 유효성 검사 일괄 처리의 손실입니다.
validation_mean_token_accuracy 모델에서 올바르게 예측한 유효성 검사 일괄 처리의 토큰 비율입니다.
예를 들어 일괄 처리 크기가 3으로 설정되고 데이터에 완료 [[1, 2], [0, 5], [4, 2]]가 포함된 경우 모델이 [[1, 1], [0, 5], [4, 2]]를 예측하면 이 값은 0.83(5/6)으로 설정됩니다.
full_valid_loss 각 epoch의 끝에서 계산된 유효성 검사 손실입니다. 학습이 잘되면 손실이 줄어들 것입니다.
full_valid_mean_token_accuracy 각 epoch의 끝에서 계산된 유효한 평균 토큰 정확도입니다. 학습이 잘 진행되면 토큰 정확도가 높아져야 합니다.

Azure AI 파운드리 포털에서 results.csv 파일의 데이터를 플롯으로 볼 수도 있습니다. 학습된 모델에 대한 링크를 선택하면 손실, 평균 토큰 정확도 및 토큰 정확도의 세 가지 차트가 표시됩니다. 유효성 검사 데이터를 제공한 경우 두 데이터 세트가 모두 동일한 플롯에 나타납니다.

시간이 지남에 따라 손실이 감소하고 정확도가 증가하는지 확인합니다. 학습 데이터와 유효성 검사 데이터 사이에 차이가 있는 경우 이는 과잉 맞춤을 의미할 수 있습니다. 더 적은 epoch 또는 더 작은 학습 속도 승수를 사용하여 학습을 시도합니다.

미세 조정된 모델 배포

미세 조정 작업의 메트릭에 만족하거나 유추로 이동하려는 경우 모델을 배포해야 합니다.

추가 유효성 검사를 위해 배포하는 경우 개발자 배포를 사용하여 테스트 용으로 배포하는 것이 좋습니다.

프로덕션을 위해 배포할 준비가 되었거나 특정 데이터 보존 요구 사항이 있는 경우 배포 가이드를 따르세요.

배포된 미세 조정된 모델 사용

미세 조정된 모델이 배포되었으면 배포된 다른 모델처럼 사용할 수 있습니다. Azure AI 파운드리플레이그라운드를 사용하여 새로운 배포를 실험할 수 있습니다. REST API를 사용하여 자체 애플리케이션에서 미세 조정된 모델을 호출할 수도 있습니다. 프롬프트 흐름에서 이 새로운 미세 조정 모델을 사용하여 생성형 AI 애플리케이션을 구축할 수도 있습니다.

비고

채팅 모델의 경우, 미세 조정된 모델을 안내하는 데 사용하는 시스템 메시지(배포되었거나 플레이그라운드에서 테스트할 수 있는지 여부)는 학습에 사용한 시스템 메시지와 동일해야 합니다. 다른 시스템 메시지를 사용하는 경우 모델이 예상대로 작동하지 않을 수 있습니다.

연속 미세 조정

미세 조정된 모델을 만든 후에는 추가 미세 조정을 통해 시간이 지남에 따라 모델을 계속 구체화할 수 있습니다. 지속적인 미세 조정은 이미 미세 조정된 모델을 기본 모델로 선택하고 새로운 학습 예제 집합에서 추가로 미세 조정하는 반복적인 프로세스입니다.

이전에 미세 조정한 모델에서 미세 조정을 수행하려면 미세 조정된 모델을 만드는 데 설명된 것과 동일한 프로세스를 사용하지만 제네릭 기본 모델의 이름을 지정하는 대신 이미 미세 조정된 모델을 지정합니다. 사용자 지정 미세 조정된 모델은 gpt-4o-2024-08-06.ft-d93dda6110004b4da3472d96f4dd4777-ft과(와) 같습니다.

미세 조정된 모델이 강조 표시된 사용자 지정 모델 만들기 UI의 스크린샷.

배포, 사용자 지정 모델 및 학습 파일 정리

사용자 지정 모델을 완료했으면 배포 및 모델을 삭제해도 됩니다. 원한다면 서비스에 업로드한 학습 및 유효성 검사 파일까지 삭제해도 됩니다.

모델 배포 삭제

중요합니다

사용자 지정된 모델을 배포한 후 언제든지 배포가 15일 이상 비활성 상태로 유지되면 배포가 삭제됩니다. 모델이 배포된 지 15일이 넘었고 연속 15일 동안 모델에 대한 완료 또는 채팅 완료 호출이 이루어지지 않은 경우 맞춤형 모델 배포는 비활성 상태입니다.

비활성 배포를 삭제해도 기본 사용자 지정 모델은 삭제되거나 영향을 받지 않으며 사용자 지정 모델은 언제든지 다시 배포될 수 있습니다. Azure AI Foundry 모델 가격 책정의 Azure OpenAI에 설명된 대로 배포된 각 사용자 지정(미세 조정된) 모델은 완료 또는 채팅 완료 호출이 모델에 대해 이루어지는지 여부에 관계없이 시간당 호스팅 비용이 발생합니다. Azure OpenAI를 사용하여 비용을 계획하고 관리하는 방법에 대한 자세한 내용은 Azure OpenAI에 대한 비용 관리 계획의 지침을 참조하세요.

Azure AI 파운드리 포털의 배포 창에서 사용자 지정 모델에 대한 배포를 삭제할 수 있습니다. 삭제할 배포를 선택한 다음, 삭제를 선택하여 배포를 삭제합니다.

사용자 지정 모델 삭제

Azure AI 파운드리 포털의 모델 창에서 사용자 지정 모델을 삭제할 수 있습니다. 사용자 지정 모델 탭에서 삭제할 사용자 지정 모델을 선택한 다음, 삭제를 선택하여 사용자 지정 모델을 삭제합니다.

비고

기존 배포가 있는 사용자 지정 모델은 삭제할 수 없습니다. 사용자 지정 모델을 삭제하려면 모델 배포부터 삭제해야 합니다.

학습 파일 삭제

Azure AI 파운드리 포털의 관리>데이터 + 인덱스 창에서 학습을 위해 업로드한 학습 및 유효성 검사 파일과 학습 중 생성된 결과 파일을 선택적으로 삭제할 수 있습니다. 삭제할 파일을 선택한 다음, 삭제를 선택하여 파일을 삭제합니다.

필수 조건

지원되는 모델

모델 페이지를 참조하여 현재 미세 조정을 지원하는 지역을 확인합니다.

또는 이전에 미세 조정한 모델을 base-model.ft-{jobid} 형식으로 미세 조정할 수 있습니다.

Python SDK에 대한 워크플로 검토

잠시 시간을 내어 Azure OpenAI에서 Python SDK를 사용하기 위한 미세 조정 워크플로를 검토하세요.

  1. 학습 및 유효성 검사 데이터를 준비합니다.
  2. 기본 모델을 선택합니다.
  3. 학습 데이터를 업로드합니다.
  4. 새 사용자 지정 모델을 학습시킵니다.
  5. 사용자 지정 모델의 상태를 확인합니다.
  6. 사용할 사용자 지정 모델을 배포합니다.
  7. 사용자 지정 모델을 사용합니다.
  8. 필요에 따라 사용자 지정 모델의 성능 및 적합성을 분석합니다.

학습 및 유효성 검사 데이터 준비

학습 데이터 및 유효성 검사 데이터 세트는 원하는 모델 성능에 대한 입력 및 출력 예제로 구성됩니다.

사용하는 학습 및 유효성 검사 데이터는 JSONL(JSON Lines) 문서 형식이어야 하며 채팅 완료 API에서 사용되는 대화 형식으로 서식을 지정해야 합니다.

gpt-4o-mini-2024-07-18 미세 조정을 단계별로 연습하려면 Azure OpenAI 미세 조정 자습서를 참조하세요.

예제 파일 형식

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

멀티 턴 채팅 파일 형식

jsonl 학습 파일의 한 줄에 여러 번 대화하는 것도 지원됩니다. 특정 도우미 메시지에 대한 미세 조정을 건너뛰려면 선택적 weight 키 값 쌍을 추가합니다. 현재 weight는 0 또는 1로 설정할 수 있습니다.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

비전을 통한 채팅 완료

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

JSONL 형식 외에도, 학습 및 유효성 검사 데이터 파일은 UTF-8로 인코딩되어야 하고 BOM(바이트 순서 표시)을 포함해야 합니다. 파일 크기는 512MB 미만이어야 합니다.

학습 및 유효성 검사 데이터 세트 만들기

학습 사례가 많을수록 좋습니다. 최소 10개의 학습 예가 없으면 미세 조정 작업을 진행할 수 없지만, 그렇게 적은 수는 모델 응답에 눈에 띄는 영향을 미치기에 충분하지 않습니다. 성공하려면 수천 개는 아니더라도 수백 개의 학습 사례를 제공하는 것이 가장 좋습니다.

일반적으로 데이터 세트 크기가 두 배로 증가할 때마다 모델 품질이 선형적으로 증가할 수 있습니다. 그러나 저품질 예제는 성능에 부정적인 영향을 미칠 수 있습니다. 최고 품질의 예제에 대해서만 데이터 세트를 먼저 정리하지 않고 대량의 내부 데이터에서 모델을 학습하는 경우, 예상보다 훨씬 더 나쁜 성능을 발휘하는 모델이 될 수 있습니다.

학습 데이터 업로드

다음 단계는 모델을 사용자 지정할 때 사용할 준비된 기존 학습 데이터를 선택하거나 준비된 새 학습 데이터를 업로드하는 것입니다. 학습 데이터를 준비한 후에는 파일을 서비스에 업로드할 수 있습니다. 학습 데이터를 업로드하는 두 가지 방법이 있습니다.

대용량 데이터 파일의 경우 Azure Blob 저장소에서 가져오는 것이 좋습니다. 요청이 원자성이어서 다시 시도하거나 다시 시작할 수 없기 때문에 대용량 파일은 멀티파트 양식을 통해 업로드할 때 불안정해질 수 있습니다. Azure Blob 스토리지에 대한 자세한 내용은 Azure Blob 스토리지란?을 참조하세요.

비고

학습 데이터 파일은 JSONL 파일로 포맷되고 BOM(바이트 순서 표시)이 있는 UTF-8로 인코딩되어야 합니다. 파일 크기는 512MB 미만이어야 합니다.

다음 Python 예제에서는 Python SDK를 사용하여 로컬 학습 및 유효성 검사 파일을 업로드하고 반환된 파일 ID를 검색합니다.

# Upload fine-tuning files

import os
from openai import OpenAI

client = OpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/"
)

training_file_name = 'training_set.jsonl'
validation_file_name = 'validation_set.jsonl'

# Upload the training and validation dataset files to Azure OpenAI with the SDK.

training_response = client.files.create(
    file=open(training_file_name, "rb"), purpose="fine-tune"
)
training_file_id = training_response.id

validation_response = client.files.create(
    file=open(validation_file_name, "rb"), purpose="fine-tune"
)
validation_file_id = validation_response.id

print("Training file ID:", training_file_id)
print("Validation file ID:", validation_file_id)

사용자 지정 모델 만들기

학습 및 유효성 검사 파일을 업로드하면 미세 조정 작업을 시작할 준비가 된 것입니다.

다음 Python 코드는 Python SDK를 사용하여 새 미세 조정 작업을 만드는 방법의 예를 보여줍니다.

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14", # Enter base model name.
    suffix="my-model", # Custom suffix for naming the resulting model. Note that in Azure OpenAI the model cannot contain dot/period characters.
    seed=105, # seed parameter controls reproducibility of the fine-tuning job. If no seed is specified one will be generated automatically.
)

job_id = response.id

# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job will take some time to start and complete.

print("Job ID:", response.id)
print("Status:", response.id)
print(response.model_dump_json(indent=2))

Global Training을 지원하는 모델을 미세 조정하는 경우 명명된 인수를 사용하여 extra_body 학습 유형을 지정할 수 있습니다.

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14",
    suffix="my-model",
    seed=105,
    extra_body={ "trainingType": "globalstandard" }
)

job_id = response.id

하이퍼 매개 변수와 같은 추가 선택적 매개 변수를 전달하여 미세 조정 프로세스를 보다 잘 제어할 수도 있습니다. 초기 학습의 경우 이러한 매개 변수를 지정하지 않고 존재하는 자동 기본값을 사용하는 것이 좋습니다.

감독된 Fine-Tuning 대해 현재 지원되는 하이퍼 매개 변수는 다음과 같습니다.

이름 유형 설명
batch_size integer 학습에 사용할 일괄 처리 크기입니다. 일괄 처리 크기는 단일 전진 및 후진 계산법을 학습하는 데 사용되는 학습 예의 수입니다. 일반적으로 일괄 처리 크기가 클수록 데이터 세트가 클수록 더 잘 작동하는 경향이 있습니다. 기본값과 이 속성의 최대값은 기본 모델과 관련이 있습니다. 일괄 처리 크기가 클수록 모델 매개 변수는 덜 자주 업데이트되지만 분산은 낮습니다.
learning_rate_multiplier 숫자 학습에 사용할 학습 속도 승수입니다. 미세 조정 학습 속도는 사전 학습에 사용된 원래 학습 속도에 이 값을 곱한 값입니다. 학습률이 클수록 일괄 처리 크기가 클수록 성능이 더 좋은 경향이 있습니다. 0.02에서 0.2 사이의 값으로 실험하여 최상의 결과를 생성하는 값을 확인하는 것이 좋습니다. 학습 속도가 작을수록 과잉 맞춤을 방지하는 데 유용할 수 있습니다.
n_epochs integer 모델을 학습할 epoch 수입니다. Epoch는 학습 데이터 세트를 통한 하나의 전체 주기를 나타냅니다.
seed integer 시드는 작업의 재현성을 제어합니다. 동일한 시드 및 작업 매개 변수를 전달하면 동일한 결과가 생성되지만 드문 경우에 다를 수 있습니다. 시드를 지정하지 않으면 시드가 생성됩니다.

OpenAI Python API의 1.x 버전으로 사용자 지정 하이퍼 매개 변수를 설정하려면 다음의 method일부로 제공합니다.

from openai import OpenAI

client = OpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/"
)

client.fine_tuning.jobs.create(
  training_file="file-abc123", 
  model="gpt-4.1-2025-04-14",
  suffix="my-model",
  seed=105,
  method={
    "type": "supervised", # In this case, the job will be using Supervised Fine Tuning.
    "supervised": {
      "hyperparameters": {
        "n_epochs": 2
      }
    }
  }
)

비고

지원되는 하이퍼 매개 변수에 대한 자세한 내용은 직접 기본 설정 최적화강화 미세 조정 가이드를 참조하세요.

미세 조정 작업 상태 확인

response = client.fine_tuning.jobs.retrieve(job_id)

print("Job ID:", response.id)
print("Status:", response.status)
print(response.model_dump_json(indent=2))

미세 조정 이벤트 나열

학습 중에 생성된 개별 미세 조정 이벤트를 검사하려면 이 명령을 실행하려면 OpenAI 클라이언트 라이브러리를 최신 버전으로 pip install openai --upgrade 업그레이드해야 할 수 있습니다.

response = client.fine_tuning.jobs.list_events(fine_tuning_job_id=job_id, limit=10)
print(response.model_dump_json(indent=2))

검사점

각 학습 epoch가 완료되면 검사점이 생성됩니다. 검사점은 후속 미세 조정 작업을 위한 대상 모델로 배포 및 사용할 수 있는 모델의 완전한 기능 버전입니다. 검사점은 과잉 맞춤이 발생하기 전에 스냅샷을 제공할 수 있으므로 특히 유용할 수 있습니다. 미세 조정 작업이 완료되면 배포할 수 있는 최신 모델 버전 3개가 제공됩니다. 최종 epoch는 미세 조정된 모델로 표시되며 이전 두 epoch는 검사점으로 사용할 수 있습니다.

목록 검사점 명령을 실행하여 개별 미세 조정 작업과 연결된 검사점 목록을 검색할 수 있습니다. 이 명령을 실행하려면 pip install openai --upgrade를 사용하여 OpenAI 클라이언트 라이브러리를 최신 버전으로 업그레이드해야 할 수도 있습니다.

response = client.fine_tuning.jobs.checkpoints.list(job_id)
print(response.model_dump_json(indent=2))

사용자 지정 모델 분석

미세 조정 작업이 완료되면 Azure OpenAI는 results.csv라는 결과 파일을 각 미세 조정 작업에 연결합니다. 이 결과 파일을 사용하여 사용자 지정 모델의 학습 및 유효성 검사 성능을 분석할 수 있습니다. 결과 파일의 파일 ID는 각 사용자 지정 모델에 대해 나열되며, Python SDK를 사용하여 파일 ID를 검색하고 결과 파일을 다운로드하여 분석할 수 있습니다.

다음 Python 예제에서는 사용자 지정된 모델의 미세 조정 작업에 연결된 첫 번째 결과 파일의 파일 ID를 검색한 다음 Python SDK를 사용하여 분석을 위해 현재 작업 디렉터리에 파일을 다운로드합니다.

# Retrieve the file ID of the first result file from the fine-tuning job
# for the customized model.
response = client.fine_tuning.jobs.retrieve(job_id)
if response.status == 'succeeded':
    result_file_id = response.result_files[0]

retrieve = client.files.retrieve(result_file_id)

# Download the result file.
print(f'Downloading result file: {result_file_id}')

with open(retrieve.filename, "wb") as file:
    result = client.files.content(result_file_id).read()
    file.write(result)

결과 파일은 미세 조정 작업에서 수행하는 각 학습 단계에 대한 머리글 행과 행을 포함하는 CSV 파일입니다. 결과 파일에는 다음 열이 포함되어 있습니다.

열 이름 설명
step 학습 단계의 수입니다. 학습 단계는 학습 데이터 일괄 처리에 대한 정방향 및 역방향 단일 패스를 나타냅니다.
train_loss 학습 일괄 처리의 손실입니다.
train_mean_token_accuracy 모델에서 올바르게 예측한 학습 일괄 처리의 토큰 비율입니다.
예를 들어 일괄 처리 크기가 3으로 설정되고 데이터에 완료 [[1, 2], [0, 5], [4, 2]]가 포함된 경우 모델이 [[1, 1], [0, 5], [4, 2]]를 예측하면 이 값은 0.83(5/6)으로 설정됩니다.
valid_loss 유효성 검사 일괄 처리의 손실입니다.
validation_mean_token_accuracy 모델에서 올바르게 예측한 유효성 검사 일괄 처리의 토큰 비율입니다.
예를 들어 일괄 처리 크기가 3으로 설정되고 데이터에 완료 [[1, 2], [0, 5], [4, 2]]가 포함된 경우 모델이 [[1, 1], [0, 5], [4, 2]]를 예측하면 이 값은 0.83(5/6)으로 설정됩니다.
full_valid_loss 각 epoch의 끝에서 계산된 유효성 검사 손실입니다. 학습이 잘되면 손실이 줄어들 것입니다.
full_valid_mean_token_accuracy 각 epoch의 끝에서 계산된 유효한 평균 토큰 정확도입니다. 학습이 잘 진행되면 토큰 정확도가 높아져야 합니다.

Azure AI 파운드리 포털에서 results.csv 파일의 데이터를 플롯으로 볼 수도 있습니다. 학습된 모델에 대한 링크를 선택하면 손실, 평균 토큰 정확도 및 토큰 정확도의 세 가지 차트가 표시됩니다. 유효성 검사 데이터를 제공한 경우 두 데이터 세트가 모두 동일한 플롯에 나타납니다.

시간이 지남에 따라 손실이 감소하고 정확도가 증가하는지 확인합니다. 학습 데이터와 유효성 검사 데이터 사이에 차이가 있는 경우 이는 과잉 맞춤을 의미할 수 있습니다. 더 적은 epoch 또는 더 작은 학습 속도 승수를 사용하여 학습을 시도합니다.

미세 조정된 모델 배포

미세 조정 작업의 메트릭에 만족하거나 유추로 이동하려는 경우 모델을 배포해야 합니다.

추가 유효성 검사를 위해 배포하는 경우 개발자 배포를 사용하여 테스트 용으로 배포하는 것이 좋습니다.

이전 SDK 명령과 달리 별도의 권한 부여, 다른 API 경로 및 다른 API 버전이 필요한 컨트롤 플레인 API를 사용하여 배포를 수행해야 합니다.

변수 정의
토큰 권한 부여 토큰을 생성하는 방법에는 여러 가지가 있습니다. 초기 테스트를 위한 가장 쉬운 방법은 Azure Portal에서 Cloud Shell을 시작하는 것입니다. 그런 다음 az account get-access-token를 실행합니다. 이 토큰을 API 테스트를 위한 임시 권한 부여 토큰으로 사용할 수 있습니다. 새 환경 변수에 저장하는 것이 좋습니다.
구독 연결된 Azure OpenAI 리소스에 대한 구독 ID.
리소스 그룹 Azure OpenAI 리소스의 리소스 그룹 이름.
리소스_이름 Azure OpenAI 리소스 이름.
모델 배포 이름 미세 조정된 새 모델 배포의 사용자 지정 이름입니다. 채팅 완료 호출을 수행할 때 코드에서 참조되는 이름입니다.
세밀하게 조정된 모델 이전 단계의 미세 조정 작업 결과에서 이 값을 검색합니다. gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83와 같이 표시됩니다. 해당 값을 deploy_data json에 추가해야 합니다. 또는 ftchkpt-e559c011ecc04fc68eaa339d8227d02d 형식으로 표시되는 검사점 ID를 전달하여 검사점을 배포할 수도 있습니다.
import json
import os
import requests

token= os.getenv("<TOKEN>") 
subscription = "<YOUR_SUBSCRIPTION_ID>"  
resource_group = "<YOUR_RESOURCE_GROUP_NAME>"
resource_name = "<YOUR_AZURE_OPENAI_RESOURCE_NAME>"
model_deployment_name ="gpt-41-ft" # custom deployment name that you will use to reference the model when making inference calls.

deploy_params = {'api-version': "2024-10-01"} # control plane API version rather than dataplane API for this call 
deploy_headers = {'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json'}

deploy_data = {
    "sku": {"name": "standard", "capacity": 1}, 
    "properties": {
        "model": {
            "format": "OpenAI",
            "name": <"fine_tuned_model">, #retrieve this value from the previous call, it will look like gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83
            "version": "1"
        }
    }
}
deploy_data = json.dumps(deploy_data)

request_url = f'https://management.azure.com/subscriptions/{subscription}/resourceGroups/{resource_group}/providers/Microsoft.CognitiveServices/accounts/{resource_name}/deployments/{model_deployment_name}'

print('Creating a new deployment...')

r = requests.put(request_url, params=deploy_params, headers=deploy_headers, data=deploy_data)

print(r)
print(r.reason)
print(r.json())

지역 간 배포에 대해 자세히 알아보고 여기에서 배포된 모델을 사용합니다.

프로덕션을 위해 배포할 준비가 되었거나 특정 데이터 보존 요구 사항이 있는 경우 배포 가이드를 따르세요.

연속 미세 조정

미세 조정된 모델을 만든 후에는 추가 미세 조정을 통해 시간이 지남에 따라 모델을 계속 구체화할 수 있습니다. 지속적인 미세 조정은 이미 미세 조정된 모델을 기본 모델로 선택하고 새로운 학습 예제 집합에서 추가로 미세 조정하는 반복적인 프로세스입니다.

이전에 미세 조정한 모델에 대해 미세 조정을 수행하려면 사용자 지정 모델 만들기에 설명된 것과 동일한 프로세스를 사용하지만 일반 기본 모델의 이름을 지정하는 대신 이미 미세 조정된 모델의 ID를 지정합니다. 미세 조정된 모델 ID는 gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7과(와) 같습니다.

import os
from openai import OpenAI

client = OpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/"
)

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7"
)

job_id = response.id

# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job will take some time to start and complete.

print("Job ID:", response.id)
print("Status:", response.id)
print(response.model_dump_json(indent=2))

또한 suffix 매개 변수를 포함하여 미세 조정된 모델의 여러 반복을 더 쉽게 구분할 수 있도록 하는 것이 좋습니다. suffix은(는) 문자열을 사용하고 미세 조정된 모델을 식별하도록 설정됩니다. OpenAI Python API를 사용하면 미세 조정된 모델 이름에 추가될 최대 18자의 문자열이 지원됩니다.

기존에 미세 조정된 모델의 ID가 확실하지 않은 경우 Azure AI 파운드리의 모델 페이지에서 해당 정보를 찾을 수 있으며, REST API를 사용하여 지정된 Azure OpenAI 리소스에 대한 모델 목록을 생성할 수도 있습니다.

배포, 사용자 지정 모델 및 학습 파일 정리

사용자 지정 모델을 완료했으면 배포 및 모델을 삭제해도 됩니다. 원한다면 서비스에 업로드한 학습 및 유효성 검사 파일까지 삭제해도 됩니다.

모델 배포 삭제

중요합니다

사용자 지정된 모델을 배포한 후 언제든지 배포가 15일 이상 비활성 상태로 유지되면 배포가 삭제됩니다. 모델이 배포된 지 15일이 넘었고 연속 15일 동안 모델에 대한 완료 또는 채팅 완료 호출이 이루어지지 않은 경우 맞춤형 모델 배포는 비활성 상태입니다.

비활성 배포를 삭제해도 기본 사용자 지정 모델은 삭제되거나 영향을 받지 않으며 사용자 지정 모델은 언제든지 다시 배포될 수 있습니다. Azure AI Foundry 모델 가격 책정의 Azure OpenAI에 설명된 대로 배포된 각 사용자 지정(미세 조정된) 모델은 완료 또는 채팅 완료 호출이 모델에 대해 이루어지는지 여부에 관계없이 시간당 호스팅 비용이 발생합니다. Azure OpenAI를 사용하여 비용을 계획하고 관리하는 방법에 대한 자세한 내용은 Azure OpenAI에 대한 비용 관리 계획의 지침을 참조하세요.

다음과 같은 다양한 방법으로 사용자 지정 모델의 배포를 삭제할 수 있습니다.

사용자 지정 모델 삭제

마찬가지로 다양한 방법으로 사용자 지정 모델을 삭제할 수 있습니다.

비고

기존 배포가 있는 사용자 지정 모델은 삭제할 수 없습니다. 사용자 지정 모델을 삭제하려면 모델 배포부터 삭제해야 합니다.

학습 파일 삭제

필요에 따라 Azure OpenAI 구독에서 학습을 위해 업로드한 학습 및 유효성 검사 파일과 학습 중에 생성된 결과 파일을 삭제할 수 있습니다. 다음 방법을 사용하여 학습, 유효성 검사 및 결과 파일을 삭제할 수 있습니다.

다음 Python 예제에서는 Python SDK를 사용하여 사용자 지정 모델의 학습, 유효성 검사 및 결과 파일을 삭제합니다.

print('Checking for existing uploaded files.')
results = []

# Get the complete list of uploaded files in our subscription.
files = openai.File.list().data
print(f'Found {len(files)} total uploaded files in the subscription.')

# Enumerate all uploaded files, extracting the file IDs for the
# files with file names that match your training dataset file and
# validation dataset file names.
for item in files:
    if item["filename"] in [training_file_name, validation_file_name, result_file_name]:
        results.append(item["id"])
print(f'Found {len(results)} already uploaded files that match our files')

# Enumerate the file IDs for our files and delete each file.
print(f'Deleting already uploaded files.')
for id in results:
    openai.File.delete(sid = id)

필수 조건

지원되는 모델

모델 페이지를 참조하여 현재 미세 조정을 지원하는 지역을 확인합니다.

또는 이전에 미세 조정된 모델을 base-model.ft-{jobid} 형식으로 미세 조정할 수 있습니다.

REST API에 대한 워크플로 검토

잠시 시간을 내어 Azure OpenAI에서 REST API 및 Python을 사용하기 위한 미세 조정 워크플로를 검토합니다.

  1. 학습 및 유효성 검사 데이터를 준비합니다.
  2. 기본 모델을 선택합니다.
  3. 학습 데이터를 업로드합니다.
  4. 새 사용자 지정 모델을 학습시킵니다.
  5. 사용자 지정 모델의 상태를 확인합니다.
  6. 사용할 사용자 지정 모델을 배포합니다.
  7. 사용자 지정 모델을 사용합니다.
  8. 필요에 따라 사용자 지정 모델의 성능 및 적합성을 분석합니다.

학습 및 유효성 검사 데이터 준비

학습 데이터 및 유효성 검사 데이터 세트는 원하는 모델 성능에 대한 입력 및 출력 예제로 구성됩니다.

사용하는 학습 및 유효성 검사 데이터는 JSONL(JSON Lines) 문서 형식이어야 하며 채팅 완료 API에서 사용되는 대화 형식으로 서식을 지정해야 합니다.

gpt-4o-mini-2024-07-18 미세 조정을 단계별로 연습하려면 Azure OpenAI 미세 조정 자습서를 참조하세요.

예제 파일 형식

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

멀티 턴 채팅 파일 형식

jsonl 학습 파일의 한 줄에 여러 번 대화하는 것도 지원됩니다. 특정 도우미 메시지에 대한 미세 조정을 건너뛰려면 선택적 weight 키 값 쌍을 추가합니다. 현재 weight는 0 또는 1로 설정할 수 있습니다.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

비전을 통한 채팅 완료

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

JSONL 형식 외에도, 학습 및 유효성 검사 데이터 파일은 UTF-8로 인코딩되어야 하고 BOM(바이트 순서 표시)을 포함해야 합니다. 파일 크기는 512MB 미만이어야 합니다.

학습 및 유효성 검사 데이터 세트 만들기

학습 사례가 많을수록 좋습니다. 최소 10개의 학습 예가 없으면 미세 조정 작업을 진행할 수 없지만, 그렇게 적은 수는 모델 응답에 눈에 띄는 영향을 미치기에 충분하지 않습니다. 성공하려면 수천 개는 아니더라도 수백 개의 학습 사례를 제공하는 것이 가장 좋습니다.

일반적으로 데이터 세트 크기가 두 배로 증가할 때마다 모델 품질이 선형적으로 증가할 수 있습니다. 그러나 저품질 예제는 성능에 부정적인 영향을 미칠 수 있습니다. 최고 품질의 예제에 대해서만 데이터 세트를 먼저 정리하지 않고 대량의 내부 데이터에서 모델을 학습하는 경우, 예상보다 훨씬 더 나쁜 성능을 발휘하는 모델이 될 수 있습니다.

학습 데이터 업로드

다음 단계는 모델을 미세 조정할 때 사용할 준비된 기존 학습 데이터를 선택하거나 준비된 새 학습 데이터를 업로드하는 것입니다. 학습 데이터를 준비한 후에는 파일을 서비스에 업로드할 수 있습니다. 학습 데이터를 업로드하는 두 가지 방법이 있습니다.

대용량 데이터 파일의 경우 Azure Blob 저장소에서 가져오는 것이 좋습니다. 요청이 원자성이어서 다시 시도하거나 다시 시작할 수 없기 때문에 대용량 파일은 멀티파트 양식을 통해 업로드할 때 불안정해질 수 있습니다. Azure Blob 스토리지에 대한 자세한 내용은 Azure Blob 스토리지란?을 참조하세요.

비고

학습 데이터 파일은 JSONL 파일로 포맷되고 BOM(바이트 순서 표시)이 있는 UTF-8로 인코딩되어야 합니다. 파일 크기는 512MB 미만이어야 합니다.

학습 데이터 업로드

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/files \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@C:\\fine-tuning\\training_set.jsonl;type=application/json"

유효성 검사 데이터 업로드

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/files \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@C:\\fine-tuning\\validation_set.jsonl;type=application/json"

사용자 지정 모델 만들기

학습 및 유효성 검사 파일을 업로드했으면 미세 조정 작업을 시작할 준비가 된 것입니다. 다음 코드는 REST API를 사용하여 새 미세 조정 작업을 만드는 방법의 예를 보여 줍니다.

이 예에서는 시드 매개 변수도 전달합니다. 시드는 작업의 재현성을 제어합니다. 동일한 시드 및 작업 매개 변수를 전달하면 동일한 결과가 생성되지만 드물게 다를 수 있습니다. 시드를 지정하지 않으면 시드가 생성됩니다.

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "seed": 105
}'

Global Training을 지원하는 모델을 미세 조정하는 경우 명명된 인수를 사용하고 api-versionextra_body을 사용하여 2025-04-01-preview 학습 유형을 지정할 수 있습니다.

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs?api-version=2025-04-01-preview \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "seed": 105,
    "trainingType": "globalstandard"
}'

또한 하이퍼 매개 변수와 같은 추가 선택적 매개 변수를 전달하여 미세 조정 프로세스를 보다 잘 제어할 수 있습니다. 초기 학습의 경우 이러한 매개 변수를 지정하지 않고 존재하는 자동 기본값을 사용하는 것이 좋습니다.

감독된 Fine-Tuning 대해 현재 지원되는 하이퍼 매개 변수는 다음과 같습니다.

이름 유형 설명
batch_size integer 학습에 사용할 일괄 처리 크기입니다. 일괄 처리 크기는 단일 전진 및 후진 계산법을 학습하는 데 사용되는 학습 예의 수입니다. 일반적으로 일괄 처리 크기가 클수록 데이터 세트가 클수록 더 잘 작동하는 경향이 있습니다. 기본값과 이 속성의 최대값은 기본 모델과 관련이 있습니다. 일괄 처리 크기가 클수록 모델 매개 변수는 덜 자주 업데이트되지만 분산은 낮습니다.
learning_rate_multiplier 숫자 학습에 사용할 학습 속도 승수입니다. 미세 조정 학습 속도는 사전 학습에 사용된 원래 학습 속도에 이 값을 곱한 값입니다. 학습률이 클수록 일괄 처리 크기가 클수록 성능이 더 좋은 경향이 있습니다. 0.02에서 0.2 사이의 값으로 실험하여 최상의 결과를 생성하는 값을 확인하는 것이 좋습니다. 학습 속도가 작을수록 과잉 맞춤을 방지하는 데 유용할 수 있습니다.
n_epochs integer 모델을 학습할 epoch 수입니다. Epoch는 학습 데이터 세트를 통한 하나의 전체 주기를 나타냅니다.
seed integer 시드는 작업의 재현성을 제어합니다. 동일한 시드 및 작업 매개 변수를 전달하면 동일한 결과가 생성되지만 드문 경우에 다를 수 있습니다. 시드를 지정하지 않으면 시드가 생성됩니다.

비고

지원되는 하이퍼 매개 변수에 대한 자세한 내용은 직접 기본 설정 최적화강화 미세 조정 가이드를 참조하세요.

사용자 지정 모델의 상태 확인

미세 조정 작업을 시작한 후 완료하는 데 시간이 걸릴 수 있습니다. 사용자의 작업이 시스템의 다른 작업 뒤에 대기 중일 수 있습니다. 모델 및 데이터 세트 크기에 따라 모델을 학습하는 데 몇 분 또는 몇 시간이 걸릴 수 있습니다. 다음 예제에서는 REST API를 사용하여 미세 조정 작업의 상태를 확인합니다. 이 예제에서는 이전 예제에서 반환된 작업 ID를 사용하여 작업 정보를 검색합니다.

curl -X GET $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<YOUR-JOB-ID> \
  -H "api-key: $AZURE_OPENAI_API_KEY"

일지 중지 및 다시 시작

학습하는 동안 로그 및 메트릭을 보고 필요에 따라 작업을 일시 중지할 수 있습니다. 일시 중지는 메트릭이 수렴되지 않거나 모델이 적절한 속도로 학습되지 않는다고 생각되는 경우에 유용할 수 있습니다. 학습 작업이 일시 중지되면 안전 평가가 완료되면 배포 가능한 검사점이 생성됩니다. 이 검사점은 추론을 위해 배포하고 사용하거나 작업이 완료될 때까지 작업을 재개하는 데 사용할 수 있습니다. 일시 중지 작업은 하나 이상의 단계에 대해 학습되고 실행 중 상태인 작업에만 적용됩니다.

일시 중지

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/pause \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

다시 시작

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/resume \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

미세 조정 이벤트 나열

학습 중에 생성된 개별 미세 조정 이벤트를 검사하려면 다음을 수행합니다.

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/events \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

모델 복사(미리 보기)

이제 동일한 테넌트 내에서 서로 다른 구독을 통해 미세 조정된 검사점 모델을 한 지역에서 다른 지역으로 복사할 수 있습니다. 이 프로세스에서는 전용 API를 사용하여 효율적이고 안전한 전송을 보장합니다. 이 기능은 현재 API를 통해서만 사용할 수 있으며 Foundry 포털을 통해서는 사용할 수 없습니다. 모델이 지역 A에서 지역 B로 복사되면 지역 B에서 모델을 지속적으로 미세 조정하고 이 위치에서 모델을 배포할 수 있습니다.

비고

원본 지역에서 모델 검사점을 삭제해도 대상 지역의 모델은 삭제되지 않습니다. 모델을 복사한 후 두 지역 모두에서 삭제하려면 각 지역에서 별도로 모델을 삭제해야 합니다.

필수 구성 요소

  • 대상 리소스/계정에는 최소한 하나의 미세 조정 작업이 있어야 합니다.
  • 대상 리소스/계정은 공용 네트워크 액세스를 사용하지 않도록 설정해서는 안 됩니다. (적어도 복사 요청을 보내는 동안에는 안 됩니다).
  • 복사를 시작한 계정에 대상 계정에 액세스할 수 있는 권한이 있는 경우에만 대상 계정에 복사할 수 있습니다.

권한 구성

  1. 사용자가 할당한 관리 ID를 만듭니다.
  2. 대상 리소스/계정에서 사용자가 할당한 관리 ID에 Cognitive Services OpenAI 기여자 역할을 부여합니다.
  3. 원본 리소스 계정에 사용자가 할당한 관리 ID를 할당합니다.

모델 복사

curl --request POST \
  --url 'https://<aoai-resource>.openai.azure.com/openai/v1/fine_tuning/jobs/<ftjob>/checkpoints/<checkpoint-name>/copy' \
  --header 'Content-Type: application/json' \
  --header 'api-key: <api-key>' \
  --header 'aoai-copy-ft-checkpoints: preview' \
  --data '{
  "destinationResourceId": "<resourceId>",
  "region": "<region>"
}'

이는 장기적으로 실행되는 작업이므로 POST 호출에 사용된 원본 계정의 검사점 ID를 제공하여 미세 조정된 모델 복사본의 상태를 확인합니다.

복사 상태 확인

curl --request GET \
  --url 'https://<aoai-resource>.openai.azure.com//openai/v1/fine_tuning/jobs/<ftjob>/checkpoints/<checkpoint-name>/copy' \
  --header 'Content-Type: application/json' \
  --header 'api-key: <api-key>' \
  --header 'aoai-copy-ft-checkpoints: preview' 

검사점

각 학습 epoch가 완료되면 검사점이 생성됩니다. 검사점은 후속 미세 조정 작업을 위한 대상 모델로 배포 및 사용할 수 있는 모델의 완전한 기능 버전입니다. 검사점은 과잉 맞춤이 발생하기 전에 스냅샷을 제공할 수 있으므로 특히 유용할 수 있습니다. 미세 조정 작업이 완료되면 배포할 수 있는 최신 모델 버전 3개가 제공됩니다. 최종 epoch는 미세 조정된 모델로 표시되며 이전 두 epoch는 검사점으로 사용할 수 있습니다.

list checkpoints 명령을 실행하여 개별 미세 조정 작업과 관련된 검사점 목록을 검색할 수 있습니다.

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/checkpoints \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

사용자 지정 모델 분석

미세 조정 작업이 완료되면 Azure OpenAI는 results.csv라는 결과 파일을 각 미세 조정 작업에 연결합니다. 이 결과 파일을 사용하여 사용자 지정 모델의 학습 및 유효성 검사 성능을 분석할 수 있습니다. 결과 파일의 파일 ID는 각 사용자 지정 모델에 대해 나열되며, REST API를 사용하여 파일 ID를 검색하고 결과 파일을 다운로드하여 분석할 수 있습니다.

다음 Python 예제에서는 REST API를 사용하여 사용자 지정 모델의 미세 조정 작업에 연결된 첫 번째 결과 파일의 파일 ID를 검색한 다음, 파일을 분석할 수 있도록 파일을 작업 디렉터리에 다운로드합니다.

curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<JOB_ID>" \
  -H "api-key: $AZURE_OPENAI_API_KEY")
curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/v1/files/<RESULT_FILE_ID>/content" \
    -H "api-key: $AZURE_OPENAI_API_KEY" > <RESULT_FILENAME>

결과 파일은 미세 조정 작업에서 수행하는 각 학습 단계에 대한 머리글 행과 행을 포함하는 CSV 파일입니다. 결과 파일에는 다음 열이 포함되어 있습니다.

열 이름 설명
step 학습 단계의 수입니다. 학습 단계는 학습 데이터 일괄 처리에 대한 정방향 및 역방향 단일 패스를 나타냅니다.
train_loss 학습 일괄 처리의 손실입니다.
train_mean_token_accuracy 모델에서 올바르게 예측한 학습 일괄 처리의 토큰 비율입니다.
예를 들어 일괄 처리 크기가 3으로 설정되고 데이터에 완료 [[1, 2], [0, 5], [4, 2]]가 포함된 경우 모델이 [[1, 1], [0, 5], [4, 2]]를 예측하면 이 값은 0.83(5/6)으로 설정됩니다.
valid_loss 유효성 검사 일괄 처리의 손실입니다.
validation_mean_token_accuracy 모델에서 올바르게 예측한 유효성 검사 일괄 처리의 토큰 비율입니다.
예를 들어 일괄 처리 크기가 3으로 설정되고 데이터에 완료 [[1, 2], [0, 5], [4, 2]]가 포함된 경우 모델이 [[1, 1], [0, 5], [4, 2]]를 예측하면 이 값은 0.83(5/6)으로 설정됩니다.
full_valid_loss 각 epoch의 끝에서 계산된 유효성 검사 손실입니다. 학습이 잘되면 손실이 줄어들 것입니다.
full_valid_mean_token_accuracy 각 epoch의 끝에서 계산된 유효한 평균 토큰 정확도입니다. 학습이 잘 진행되면 토큰 정확도가 높아져야 합니다.

Azure AI 파운드리 포털에서 results.csv 파일의 데이터를 플롯으로 볼 수도 있습니다. 학습된 모델에 대한 링크를 선택하면 손실, 평균 토큰 정확도 및 토큰 정확도의 세 가지 차트가 표시됩니다. 유효성 검사 데이터를 제공한 경우 두 데이터 세트가 모두 동일한 플롯에 나타납니다.

시간이 지남에 따라 손실이 감소하고 정확도가 증가하는지 확인합니다. 학습 데이터와 유효성 검사 데이터 사이에 차이가 있는 경우 이는 과잉 맞춤을 의미할 수 있습니다. 더 적은 epoch 또는 더 작은 학습 속도 승수를 사용하여 학습을 시도합니다.

미세 조정된 모델 배포

미세 조정 작업의 메트릭에 만족하거나 유추로 이동하려는 경우 모델을 배포해야 합니다.

추가 유효성 검사를 위해 배포하는 경우 개발자 배포를 사용하여 테스트 용으로 배포하는 것이 좋습니다.

프로덕션을 위해 배포할 준비가 되었거나 특정 데이터 보존 요구 사항이 있는 경우 배포 가이드를 따르세요.

변수 정의
토큰 권한 부여 토큰을 생성하는 방법에는 여러 가지가 있습니다. 초기 테스트를 위한 가장 쉬운 방법은 Azure Portal에서 Cloud Shell을 시작하는 것입니다. 그런 다음 az account get-access-token를 실행합니다. 이 토큰을 API 테스트를 위한 임시 권한 부여 토큰으로 사용할 수 있습니다. 새 환경 변수에 저장하는 것이 좋습니다.
구독 연결된 Azure OpenAI 리소스에 대한 구독 ID.
리소스 그룹 Azure OpenAI 리소스의 리소스 그룹 이름.
리소스_이름 Azure OpenAI 리소스 이름.
모델 배포 이름 미세 조정된 새 모델 배포의 사용자 지정 이름입니다. 채팅 완료 호출을 수행할 때 코드에서 참조되는 이름입니다.
세밀하게 조정된 모델 이전 단계의 미세 조정 작업 결과에서 이 값을 검색합니다. gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83와 같이 표시됩니다. 해당 값을 deploy_data json에 추가해야 합니다. 또는 ftchkpt-e559c011ecc04fc68eaa339d8227d02d 형식으로 표시되는 검사점 ID를 전달하여 검사점을 배포할 수도 있습니다.
curl -X POST "https://management.azure.com/subscriptions/<SUBSCRIPTION>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.CognitiveServices/accounts/<RESOURCE_NAME>/deployments/<MODEL_DEPLOYMENT_NAME>?api-version=2024-10-21" \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "sku": {"name": "standard", "capacity": 1},
    "properties": {
        "model": {
            "format": "OpenAI",
            "name": "<FINE_TUNED_MODEL>",
            "version": "1"
        }
    }
}'

지역 간 배포에 대해 자세히 알아보고 여기에서 배포된 모델을 사용합니다.

연속 미세 조정

미세 조정된 모델을 만든 후에는 추가 미세 조정을 통해 시간이 지남에 따라 모델을 계속 구체화할 수 있습니다. 지속적인 미세 조정은 이미 미세 조정된 모델을 기본 모델로 선택하고 새로운 학습 예제 집합에서 추가로 미세 조정하는 반복적인 프로세스입니다.

이전에 미세 조정한 모델에 대해 미세 조정을 수행하려면 사용자 지정 모델 만들기에 설명된 것과 동일한 프로세스를 사용하지만 일반 기본 모델의 이름을 지정하는 대신 이미 미세 조정된 모델의 ID를 지정합니다. 미세 조정된 모델 ID는 gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7과(와) 같습니다.

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "suffix": "<additional text used to help identify fine-tuned models>"
}'

또한 suffix 매개 변수를 포함하여 미세 조정된 모델의 여러 반복을 더 쉽게 구분할 수 있도록 하는 것이 좋습니다. suffix은(는) 문자열을 사용하고 미세 조정된 모델을 식별하도록 설정됩니다. 접미사는 미세 조정된 모델 이름에 추가될 최대 40자(a-z, A-Z, 0-9 및 _)를 포함할 수 있습니다.

미세 조정된 모델의 ID가 확실하지 않은 경우 이 정보는 Azure AI 파운드리의 모델 페이지에서 찾거나 REST API를 사용하여 지정된 Azure OpenAI 리소스에 대한 모델 목록을 생성할 수 있습니다.

배포, 사용자 지정 모델 및 학습 파일 정리

사용자 지정 모델을 완료했으면 배포 및 모델을 삭제해도 됩니다. 원한다면 서비스에 업로드한 학습 및 유효성 검사 파일까지 삭제해도 됩니다.

모델 배포 삭제

다음과 같은 다양한 방법으로 사용자 지정 모델의 배포를 삭제할 수 있습니다.

사용자 지정 모델 삭제

마찬가지로 다양한 방법으로 사용자 지정 모델을 삭제할 수 있습니다.

비고

기존 배포가 있는 사용자 지정 모델은 삭제할 수 없습니다. 사용자 지정 모델을 삭제하려면 모델 배포부터 삭제해야 합니다.

학습 파일 삭제

필요에 따라 Azure OpenAI 구독에서 학습을 위해 업로드한 학습 및 유효성 검사 파일과 학습 중에 생성된 결과 파일을 삭제할 수 있습니다. 다음 방법을 사용하여 학습, 유효성 검사 및 결과 파일을 삭제할 수 있습니다.