본문 바로가기
C.W.K.
Stream
Lesson 05 of 06 · published

착지 후 검증

~11 min · verification, corruption, bit-rot, health

Level 0Kindling
0 XP0/32 lessons0/10 achievements
0/100 XP to next level100 XP to go0% complete

진실의 순간은 바이트가 멈춘 뒤에 온다

수집이 끝나면 저장이 시작돼 — 그리고 두 순간의 실패 모드는 달라. 전송 중엔 실패가 시끄러워 (중단된 연결, 크기 불일치). 정지 상태에선 실패가 조용해: 디스크는 의례 없이 비트를 뒤집고, 파일은 중단된 복사에 잘리고, 파일시스템은 불량 블록을 표시하고 조용히 재배치해. 저장 손상을 알리는 건 아무것도 없어. 파일은 그냥 거기 앉아, 틀리게, 무언가 그걸 로드하는 날까지.

착지 후 검증은 그래서 다운로드 관심사가 아니야 — 세 순간을 가진 저장 훈련이지:

  1. 착지 점검 (한 번). 이 트랙의 완전한 의례: 크기, 그다음 다이제스트, 그다음 — 지원하는 포맷이면 — 구조 파싱(safetensors 헤더 열기, GGUF 메타데이터 덤프). 파싱은 다이제스트가 기술할 수 없는 걸 잡아: 바이트는 완벽하지만 주장된 포맷과 구조적으로 불일치인 파일.
  2. 이전 점검 (모든 복사). 바이트가 움직일 때마다 — 디스크에서 디스크로, 머신에서 NAS로, 클라우드에서 로컬로 — 손상의 새 기회야. 다이제스트 기록이 아티팩트와 함께 여행하는 건 정확히 모든 사본이 자기 정체성을 다시 벌 수 있게 하려고야. 재점검 없는 이전은 검증된 파일의 역사를 입은 미검증 사본이야.
  3. 정지 점검 (주기적으로). 저장된 다이제스트의 느린 스윕(월간이든 분기별이든 규모에 맞게)은 회복이 아직 가능할 때(그게 복제의 존재 이유지) bit rot과 조용한 붕괴를 잡아.

각 악기가 보는 것

세 악기를 전부 써. 서로 다른 걸 보거든. 크기는 잘림을 싸게 잡아. 다이제스트는 기록된 참조와의 바이트 동일성을 증명해 — 일꾼이지. 구조 파싱은 포맷 온전성을 증명해: JSON 헤더가 디코딩되고, 오프셋이 파일 안에 떨어지고, 텐서 수가 인덱스와 맞아. 파일은 하나를 통과하고 다른 걸 실패할 수 있어: 운 좋은 크기의 잘린 파일, 파싱은 되는 손상 헤더, 내용이 틀린 온전한 파일. 싼 점검부터 순서대로, 비싼 신뢰는 마지막에 — 리뷰 데스크의 규칙을 자기 저장소에 적용한 거야.

모든 사본은 정체성을 다시 번다. 검증된 원본이 사본들을 보증하지 않아. 모든 착지(수집, 이전, 복구)는 같은 크기-그리고-다이제스트-그리고-파싱 의례를 받아.

루틴으로 만들기

훈련 전체는 이 퀘스트의 연습에서 이미 쓴 스크립트로 압축돼: 아카이브를 걷고, 크기와 다이제스트를 SHA256SUMS와 비교하고, 파일마다 한 줄 보고해. 예약해 두고, 모든 이전 뒤에 예외 없이 돌리고, FAILED는 복구 이벤트로 다뤄 — 낙관이 아니라 복제에서 당겨와. 아카이브의 건강은 달성하는 상태가 아니라. 계속 취하는 측정이야.

Code

세 순간 검증, 한 스크립트·bash
cd ~/models/<model>

# 착지 / 이전 / 정지 — 같은 의례:
# 1) 크기 (즉시, 잘림 포착)
stat -f "%z %N" *.safetensors

# 2) 다이제스트 (일꾼)
shasum -a 256 -c SHA256SUMS 2>&1 | grep -v ': OK$' || echo "모든 다이제스트 OK"

# 3) 구조 파싱 (포맷 온전성, 다이제스트가 기술 못 하는 것 포착)
python3 - <<'EOF'
import json, struct, glob, sys
for path in sorted(glob.glob("*.safetensors")):
    with open(path, "rb") as f:
        n = struct.unpack("<Q", f.read(8))[0]
        header = json.loads(f.read(n))
    import os
    tensors = {k: v for k, v in header.items() if k != "__metadata__"}
    print(f"{path}: {len(tensors)} tensors, 헤더 {n}B, 파일 {os.path.getsize(path)}B -> 파싱 OK")
EOF

# 정지 상태의 FAILED 다이제스트 = 복구 이벤트 (복제에서 당겨오기),
# 절대 어깨 으쓱도 아니고 제자리 덮어쓰기도 아니야.

External links

Exercise

세 순간 검증 스크립트를 쓰거나 재사용해서, 네가 통제하는 아카이브 디렉토리에 대해 돌려 봐. 그다음 사본에서 두 실패를 시뮬레이션해: 한 파일은 자르고(head -c), 다른 파일은 한 바이트를 부패시켜(dd seek). 스크립트를 돌리고 각 실패가 올바른 악기에 잡히는지 확인해. 어느 악기가 어느 실패를 잡았는지 기록해.
Hint
잘림은 크기 점검이 먼저 잡아야 하고, 한 바이트 부패는 크기는 유지하지만 다이제스트에서 실패해. 그 차이가 의례에 둘 다 있는 이유야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.