콘텐츠로 이동

실습: 배포 판단 기록 완성하기

마지막 교시에는 새 보고서를 처음부터 쓰지 않습니다. 앞선 교시에서 확인한 데이터, 모델 평가, 서빙, 운영 관측 근거를 한 작업본에서 연결하고, 현재 확인 범위에 맞는 배포 행동을 결정합니다. Candidate B의 모델 승인과 운영 환경 확인 상태는 서로 다른 근거로 판단합니다.

5교시부터 이어지는 한 조사

  • 5교시, 팀 산출물: 팀 수집 자료를 생성·확인하거나 준비된 offline 수집 묶음을 확인해 공통 출처를 정합니다. 인계 점검에서 live 경로에 필요한 정보를 확인하지 못하면 offline 경로를 선택하고 다시 시작하지 않습니다.
  • 6교시, 개인 산출물: 요청 단위 원인 조사에서 절대 UTC 범위를 복원하고 5-1과 5-2를 연결합니다. 05-3 요청 조사를 마친 결과와 대표 요청의 판단을 개인 관찰 기록에 남깁니다.
  • 7교시, 개인 산출물: 6교시에서 완료한 요청 조사 결과를 이어받아 5-6 기준으로 운영 판단을 적용하고 5-8에서 회고와 최종 기록을 완성합니다.

작업본과 필수 입력 확인하기

tta-aiqa 저장소 루트에서 작업본이 없을 때만 시작 양식을 복사합니다.

mkdir -p artifacts/reports
test -f artifacts/reports/release-decision-record.md || \
  cp labs/record.md \
    artifacts/reports/release-decision-record.md

제출 파일은 artifacts/reports/release-decision-record.md입니다. 이 파일은 장별 보고서를 반복해서 붙이는 양식이 아닙니다.

복사한 양식의 2일차 6교시와 7교시 예시 문구는 이전 수업 순서에서 남은 안내이므로 그대로 따르지 않습니다. 6교시 행에는 전체 추세, 대표 요청, 로그와 처리 경로, 원인 후보와 추가 검증 조건까지 기록하고, 7교시 행에는 그 결과를 이어받은 모델 승인, 운영 상태, 양쪽 비용과 회고를 기록합니다. 7교시에는 새 요청을 고르거나 로그와 처리 경로를 다시 조회하지 않습니다.

기록 영역 이번 교시에 확인할 내용
교시별 짧은 메모 각 교시의 예상, 직접 본 관측, 수정한 판단과 다음 질문
대표 근거 목록 범위·확인한 사실, 출처·UTC, 미확인
최종 판단 모델 승인, 운영 환경 확인 상태, 현재 권고, 양쪽 위험, 다음 행동
검토 메타데이터 판단한 절대 시각, 검토자와 검토 결과, 핵심 근거 버전 또는 해시

마지막 교시를 시작하기 전에 다음 입력이 있는지 확인합니다. 비어 있는 항목을 추측으로 채우지 말고 BLOCKED 또는 미확인과 담당자를 적습니다.

  • 팀 수집 자료의 유형(live/offline), 환경, 모델 정보, 실행 ID, 절대 UTC 범위
  • 6교시 개인 관찰 기록의 대시보드 관측, 입력·점수·예측 분포 해석, 선택한 요청
  • 대표 근거 목록의 데이터·모델·서빙 자료
  • Candidate A와 B의 공식 모델 평가 결과

1. 6교시 요청 조사 결과 확인하기

7교시는 대표 요청을 다시 고르는 시간으로 시작하지 않습니다. 6교시에서 05-3 요청 조사를 완료한 결과를 개인 관찰 기록에서 확인하고, 환경·절대 UTC 범위·실행 ID·요청 ID·원인 후보 상태를 5-6 운영 판단의 입력으로 삼습니다.

6교시 개인 관찰 기록에 연결 결과가 없거나 범위가 맞지 않으면 새 조회나 추적 실행으로 빈칸을 추측해 채우지 않습니다. 확인하지 못한 범위와 담당자, 다음 확인 조건을 미확인으로 남긴 뒤 5-6 판단의 범위를 줄입니다.

개인 관찰 기록에는 다음 네 요소가 남아 있는지 점검합니다.

  • 사실: 환경, 범위, 시나리오, 요청 ID, trace에서 직접 본 결과
  • 해석: 강화·약화·유지·제외한 원인 후보
  • 한계: 정답 부재, 대표 요청 한 건, 수집 또는 대상 환경의 미확인 범위
  • 다음 조치: 담당자, 필요한 자료, 기한, 다시 판단할 조건

같은 내용을 별도의 장별 블록에 다시 복사하지 않고, 필요한 요지만 교시별 짧은 메모와 최종 기록에 연결합니다.

먼저 확정된 모델 평가와 준비된 배포 연결 정보가 서로 맞는지 확인합니다. 공식 평가를 다시 실행해 후보나 기준을 바꾸지는 않습니다. 모델 품질과 서빙 확인 근거가 없거나 현재 작업본의 후보·배포 선언과 맞지 않을 때만 아래 명령을 실행합니다. 이미 확인한 근거가 맞으면 그 근거 경로를 이어 쓰고 5-6 운영 판단으로 진행합니다.

uv run python labs/run/model_status.py --revision v2
uv run --group dev pytest -q \
  tests/integration/apps/serving/test_publish_model.py \
  tests/integration/qa \
  tests/integration/deployment/test_kubernetes_contract.py
uv run jupyter nbconvert --to notebook --execute \
  labs/chapters/ch05/01_review_release_decision.ipynb \
  --output /tmp/ch05-release-decision.ipynb \
  --ExecutePreprocessor.timeout=120

예상한 모델 승인 결과는 Candidate A=HOLD, Candidate B=APPROVE입니다. deployment_allowed=true와 Candidate B의 배포 연결 검사가 통과했다는 사실은 모델 패키지와 배포 설정을 준비할 수 있다는 근거입니다. 대상 API가 이미 Candidate B를 실행하거나 운영 상태가 정상이라는 근거는 아닙니다.

모델 식별값의 출처를 섞지 않습니다.

출처 확인할 값 주의할 경계
/v1/model 프로필, 버전, 임계값 전체 모델 SHA-256을 반환하지 않음
배포 선언·오버레이·모델 패키지 메타데이터 전체 모델 SHA-256과 고정 경로 파일이 있다는 사실만으로 실제 탑재를 증명하지 않음
팀 수집 자료 예측 응답의 model_identity, 환경, 실행 ID, 세션·시나리오 절대 UTC 범위 별도 /v1/model 확인 시각을 매니페스트 값처럼 만들거나 다른 환경·시간대와 합치지 않음

/v1/model의 version 끝에 짧은 해시 접두사가 보일 수 있지만 전체 SHA-256은 아닙니다. 전체 값은 배포 자료에서 따로 확인하고, API의 프로필·버전·임계값과 함께 같은 모델을 가리키는지 대조합니다.

대상 URL을 설정하지 않았을 때 URL_NOT_CONFIGURED가 나오는 것은 정상적인 미확인 결과입니다. 이때 Candidate B의 모델 승인은 유지하고 대상 환경 자료를 담당자의 다음 행동으로 남깁니다.

3. 운영 환경 확인 상태 정하기

5-6 모델 기준과 운영 기준을 적용해 실제로 본 범위만 상태로 정합니다.

확인 경로 쓸 수 있는 상태 방향 현재 권고를 정할 때 볼 것
파일·노트북만 확인 정적 검사 중에는 prepared, 최종 판단에서는 target_pending 대상 URL·모델 정보·운영 자료의 담당자와 기한
기본 baseline의 로컬 live 자료를 수집·분석 증거 범위=local, operational_deployment_scope=target_pending 기존 운영 모델의 정보·요청·신호를 원인 조사에 사용하되 Candidate B 실행 근거로 바꾸지 않음
Candidate B를 로컬에서 실제 서빙·관측 local_verified 검토 Candidate B 모델 정보, 정상·무효 요청, 같은 범위의 운영 신호와 앞선 요청 조사 결과
대상 Candidate B의 live 자료를 수집·분석 target_verified 또는 rollback_required 대상 모델 정보, 정상 요청, 같은 범위의 지표·로그·앞선 요청 조사 결과를 보고 배포 진행·보류·되돌리기 검토를 별도로 정함
준비된 offline 자료 사용 증거 범위=static, operational_deployment_scope=target_pending 연결 계약과 해석은 가능하지만 실제 수집·대상 상태는 미확인

의도적으로 잘못 보낸 invalid 요청의 422는 입력 검사가 작동했다는 근거입니다. 5xx, 예상 모델 정보 불일치, 규약에 맞는 요청의 실패와 같은 되돌리기 검토 조건으로 자동 변환하지 않습니다.

대상 환경에서 실제 모델 불일치나 정상 요청 실패를 확인했다면 공식 평가 수치와 Candidate B의 모델 승인 결과는 바꾸지 않습니다. 운영 환경 확인 상태는 rollback_required, 현재 권고는 배포 보류와 되돌리기 검토로 분리하고, 복구를 확인할 담당자와 종료 조건을 적습니다. 실제 게시·GitOps 동기화·되돌리기 실행은 이 과정의 수강생 실습 범위가 아니며, 플랫폼 담당자의 확인 결과를 근거로만 사용합니다.

4. 최종 판단과 다음 행동 쓰기

최종 판단은 다음 순서로 씁니다.

  1. model_approval에 Candidate A와 B의 공식 판단과 근거 경로를 적습니다.
  2. operational_deployment_scope에 직접 확인한 범위를 적습니다.
  3. 잘못 승인할 위험과 지나치게 보류할 위험을 각각 하나 이상 적습니다.
  4. 현재 권고를 제한적 배포, 자료 수집, 보류, 되돌리기 검토 가운데 근거가 허용하는 범위로 정합니다.
  5. 담당자·필요 자료·기한·재평가 조건을 한 행으로 연결합니다.
  6. 판단한 절대 시각, 검토자와 검토 결과, 핵심 근거 버전 또는 해시를 남깁니다.

복사한 작업본에 검토 메타데이터 칸이 없으면 ## 최종 판단 아래에 다음 블록을 그대로 추가합니다. 값이 없는 항목은 추정하지 않고 미확인과 확인 담당자를 함께 적습니다.

- 판단 시각(UTC):
- 검토자 / 검토 결과:
- 핵심 근거 버전 또는 해시:
필요한 자료 담당 팀 다시 판단할 조건
같은 시간대의 입력 분포와 결측 비율 데이터 기준 구간과 차이가 확인되면 입력 조건 후보 갱신
대상 /v1/model과 정상 요청 서빙 프로필·버전·임계값과 정상 응답 확인
전체 모델 SHA-256과 GitOps 상태 플랫폼 선언·메타데이터·실제 실행 정보가 같은 모델을 가리킴
같은 범위의 지표·로그·trace 플랫폼, 서빙 요청 ID가 연결되고 지연·5xx 조건을 확인함

별도 결론 칸은 만들지 않습니다. 위 다섯 줄의 현재 권고와 다음 행동이 최종 결론 역할을 하며, 근거 경로와 확인 범위를 함께 읽을 수 있어야 합니다.

5. 전이 사건과 마무리 동료 검토

05-8 회고와 최종 기록은 새 운영 사실이 들어왔을 때 어떤 판단 항목만 바뀌는지 확인하는 개인 과제입니다. 다음 여섯 항목만 작성합니다.

  • 직접 확인한 사실
  • 아직 모르는 사실
  • 바뀌는 판단 항목
  • 양쪽 위험의 변화
  • 현재 권고
  • 담당자·필요 자료·재평가 조건

이어서 다른 역할의 수강생과 마무리 동료 검토를 진행합니다. 품질 검토자는 근거 경로와 범위를, ML 담당자는 모델 승인과 운영 분포의 분리를, 서빙 담당자는 API 모델 정보와 요청 ID를, 플랫폼 담당자는 전체 SHA-256·절대 UTC 범위·trace 공백을 확인합니다.

리뷰에서 지적받은 모든 표현을 고치는 것이 목표는 아닙니다. 근거를 다시 찾을 수 없거나 결론 범위가 넓어진 문장 한 개를 먼저 수정한 뒤 같은 파일을 제출합니다.

제출 전 확인

  • 교시별 짧은 메모와 대표 근거 목록이 서로 역할을 중복하지 않는가
  • 개인 관찰 기록에 팀 수집 자료 유형·경로, 환경, 절대 UTC 범위, 선택한 요청과 trace 한계가 있는가
  • /v1/model의 모델 정보와 별도 배포 자료의 전체 SHA-256을 구분했는가
  • 모델 승인과 운영 환경 확인 상태를 따로 판단했는가
  • 잘못 승인할 위험과 지나치게 보류할 위험을 모두 적었는가
  • 담당자, 필요한 자료, 기한, 재평가 조건이 연결되는가
  • 보지 못한 대상 환경이나 수집 결과를 완료로 기록하지 않았는가

명령이나 외부 환경이 막혔다면 결과를 추정하지 않습니다. result=BLOCKED, 확인하려던 범위, 오류 또는 미준비 사유, 담당자의 다음 행동을 남기면 검토 가능한 산출물이 됩니다.

환경 정리

최종 판단과 제출을 마친 뒤 강사 안내에 따라 자신이 시작한 Compose 환경만 종료합니다. 다른 사람이 시작한 공동 환경은 종료하지 않습니다.

docker compose \
  -f deploy/compose.yaml \
  -f deploy/compose.grafana-cloud.yaml \
  down