Cloudera 분석 환경의 AMP 예제에는 허깅페이스 모델을 받아 오는 셸 스크립트가 들어 있다. 런타임 이미지에 git-lfs 가 없어서, 스크립트가 다음 문구를 찍고 LFS 파일을 직접 내려받는 방식으로 우회한다.
These files must be downloaded manually since there is no git-lfs here
폐쇄망에서는 이 스크립트가 외부로 나가지 못해 그대로 멈춘다.
핵심은 두 줄이다.
GIT_LFS_SKIP_SMUDGE=1 git clone "$MODEL_REPO" --branch main model-dir
GIT_LFS_SKIP_SMUDGE=1 은 클론할 때 LFS 실제 파일을 받지 않게 한다. 저장소에는 파일 본체 대신 포인터 텍스트만 들어오므로, git-lfs 가 없어도 클론이 성공한다. 포인터 파일은 다음처럼 생겼다.
version https://git-lfs.github.com/spec/v1
oid sha256:1a2b3c...
size 438007057
그다음 함수가 LFS 로 관리되는 파일 목록을 뽑아 HTTP 로 하나씩 받는다.
git ls-files | git check-attr --stdin filter \
| awk -F': ' '$3 ~ /lfs/ { print $1 }'
.gitattributes 에 filter=lfs 로 표시된 파일만 고르는 것이다. 각 파일은 허깅페이스의 resolve 경로에서 받는다.
curl -O -L "$(git remote get-url origin)/resolve/$COMMIT/$file"
즉 git-lfs 클라이언트가 하는 일을 curl 로 흉내 낸 것이고, 커밋 해시를 고정해 항상 같은 산출물을 받게 했다.
두 갈래가 있다. 반입 절차와 저장소 정책에 따라 고른다.
인터넷이 되는 장비에서 스크립트를 그대로 돌려 models/ 디렉터리를 만든 뒤, 그 디렉터리를 반입한다. 반입 후 스크립트에서 내려받기 부분을 지우고, 모델 경로만 그 자리를 가리키게 둔다.
가장 단순하고 확실하다. 모델이 수 GB 이므로 체크섬을 함께 옮겨 검증한다.
sha256sum -c SHA256SUMS
사내 Git 이나 오브젝트 스토리지에 올려 두고 URL 만 바꾼다. 이때 주의할 점이 있다. resolve/<커밋>/<파일> 경로는 허깅페이스 고유 규칙이지 Git 표준이 아니다. 사내 GitLab 이나 Gitea 로 바꾸면 그 경로는 존재하지 않는다.
사내 Git 이 LFS 를 지원한다면 우회 자체가 필요 없다. 런타임에 git-lfs 를 넣고 평범하게 클론한다.
LFS 를 안 쓴다면 모델 파일을 Git 에 넣지 말고, 파일 서버나 오브젝트 스토리지에 올린 뒤 받는 부분만 바꾸는 편이 낫다.
MODEL_BASE="http://artifacts.example.local/models/all-MiniLM-L12-v2"
download_model_files () {
local dest="$1"; shift
mkdir -p "$dest"
for f in "$@"; do
curl -fSL --retry 3 -o "$dest/$f" "$MODEL_BASE/$f"
done
}
download_model_files ./models/embedding-model \
config.json tokenizer.json model.safetensors
-f 를 붙이는 것이 중요하다. 이것이 없으면 404 응답 본문이 파일로 저장돼, 나중에 모델 적재 단계에서 알 수 없는 오류로 나타난다.
이 스크립트나 뒤이은 모델 적재에서 Killed 만 남고 끝나는 경우가 있다. 이것은 스크립트 오류가 아니라 커널 OOM killer 가 프로세스를 죽인 것이다. 수 GB 짜리 모델을 메모리로 올리는 단계에서 세션 메모리 한도를 넘는다.
확인한다.
dmesg -T | grep -i 'killed process'
grep -i 'oom' /var/log/messages
대응은 세션 자원을 늘리는 것이다. 분석 세션을 만들 때 메모리를 모델 크기의 두 배 이상으로 잡는다. 디스크 쪽이면 No space left on device 가 나므로 메시지로 구분된다.
커밋 해시를 고정한 것은 재현성을 위한 것이다. 사내 저장소로 옮기더라도 어떤 커밋의 산출물인지 기록해 둔다.
모델 라이선스를 확인한다. 사내 저장소에 복제해 배포하는 것이 허용되는지는 모델마다 다르다.
safetensors 와 bin 형식이 함께 올라와 있는 저장소가 많다. 둘 다 받으면 용량이 두 배가 되므로 필요한 쪽만 받는다.