하나의 아이디어를 반복 가능한 제품 파이프라인으로 만들기 (GPU 없음)
한때 저는 같은 12개 벡터를 어느 오후에 두 번이나 업로드했습니다. 같은 폴더, 같은 배치 스크립트, 그리고 커피가 너무 많았기 때문입니다. 메타데이터에 제목이 일치하자 플랫폼에서 중복 제출로 계정을 플래그 처리했습니다. 그날을 계기로 저는 '업로드'를 수동 단계로 취급하는 것을 멈췄습니다.
해결책은 프레임워크나 클라우드 계정이 아니었습니다. 그것은 제가 저녁 시간 안에 읽을 수 있는 네 개의 Python 스크립트였습니다. 실제로 작동하는 것이 무엇인지 알려드립니다.
모든 제출물이 좌절되는 곳: 메타데이터
Adobe, Vecteezy, Dreamstime 모두 잘못된 CSV 헤더를 즉시 거부합니다. 파일 자체가 아니라 헤더입니다. 완벽한 아트를 가지고 있어도 단 하나의 누락된 열만 있으면 전체 배치가 실패합니다.
make_metadata.py는 각 플랫폼이 요구하는 정확한 헤더를 만듭니다: Adobe용 5개 열, Vecteezy용 4개 열, Dreamstime용 15개 열. 추가되는 것은 없고, 빠지는 것도 없습니다.
python make_metadata.py ./my-assets --platform adobe --out metadata.csv --ext .jpg
하나의 솔직한 주의사항이 있습니다. --titles titles.json 파일 없이는 스크립트가 파일 이름을 제목 형식(title-case)으로 만들고 그것을 제목으로 사용합니다. 첫 번째 시도에는 괜찮습니다. 제출하기 전에 교체하세요. 왜냐하면 '파일 이름 = 제목'은 그 자체로 읽히기 때문입니다.
이것은 이 스택의 규모를 이해할 때 더 중요해집니다. 이 프로젝트가 파생된 상위 프로젝트는 대략 19,000줄의 파이프라인 코드로 이루어져 있으며, 이 스크립트들이 강제하는 규칙 뒤에는 300페이지 이상의 연구가 담겨 있습니다. 메타데이터 규칙은 임의적이지 않습니다. 그것들은 수많은 실패한 배치들의 압축된 결과물입니다.
중복 게시가 계정을 잃는 가장 빠른 방법
그 12개 벡터는 기술적인 문제가 아니었습니다. 기억력 문제였습니다. 저는 이미 보낸 200개의 파일 중 어떤 것을 확실하게 기억할 수 없었습니다.
upload_tracker.py는 원장(ledger)입니다. 이것은 여러분이 무엇을 게시했는지 기억하므로, 재실행 시 물리적으로 중복 게시하는 것이 불가능합니다.
python upload_tracker.py pending items.txt
python upload_tracker.py done
이것은 표준 라이브러리만 사용합니다. 설치가 필요 없고, 데이터베이스도 없습니다. 완료된 배치에 재실행하면 비어 있는 대기 목록을 보여주고 중단됩니다. 이것이 핵심입니다.
## 문서(doc)는 제품처럼 보이지 않으면 제품이 아니다
콘텐츠는 있습니다. 하지만 구매자에게 노출되어 살아남으려면 그것이 필요합니다. 원본 Markdown 파일은 그렇지 못합니다.
`md2pdf.py`는 제목, 표, 목록 및 링크가 포함된 스타일화된 PDF를 하나의 명령어로 Markdown 파일을 변환합니다:
python md2pdf.py content.md product.pdf "내 제품 제목"
이것은 사람들이 건너뛰는 단계이며, 청구할 수 있는 가격을 결정하는 단계입니다. 스타일화된 PDF는 제품처럼 보이고, `.md` 파일은 초안처럼 보입니다.
## 커버가 없는 zip 파일은 팔리지 않는다
`pack_product.py`는 전체를 묶습니다: 파일을 압축하고, 1280x720 크기의 커버와 600x600 썸네일을 렌더링합니다.
python pack_product.py my-product "내 제품" "짧은 부제목" 9
이것은 zip, 커버, 썸네일을 `_system` 폴더에 작성합니다. `--dir` 또는 `PACK_ROOT` 환경 변수를 사용하여 다른 곳을 가리킬 수 있으며, 스크립트 수정이 필요 없습니다.
네 가지 스크립트는 하나의 파이프라인 아이디어에 들어맞습니다. 저는 이것들을 사용해 39개의 제품, 856 MB의 출력을 단일 vCPU와 2 GB RAM, 그리고 GPU 없이 패키징했습니다. 데모가 아닙니다. 실제 실행입니다.
## 카탈로그가 잡동사니 서랍이 되는 것을 막는 폴더 구조
project/
assets/ 원시 출력물, 에셋당 하나의 파일
output/ 제출 준비 완료된 파일 + metadata.csv
...
제가 힘든 경험을 통해 배운 두 가지가 있습니다. `research/`는 영원히 보관하세요. 여러분의 스크랩 로그와 메모는 다음 제품의 원자재이며, 이것들을
- 한 번에 하나의 프로세스만 처리하고, 병렬 렌더 팬아웃(parallel render fan-out)을 사용하지 마세요.
- 각 에셋 처리 후 `gc.collect()`를 호출하여 메모리를 해제하세요.
- 평균값 대신 피크 RSS(Peak RSS)를 측정하세요. `resource.getrusage(RUSAGE_SELF).ru_maxrss`가 실제 최대치를 알려줍니다.
- 무거운 렌더링 단계의 경우, 각 파일을 별도의 서브프로세스(subprocess)로 처리하여 메모리가 OS로 반환되게 하세요.
- 실제로 필요한 해상도에서 렌더링하세요. 버려지는 300 dpi 렌더보다 60 dpi 미리보기가 더 좋습니다.
## 시작할 곳
메타데이터(metadata)와 추적(tracking)만 다룬다면, 아무것도 설치할 필요가 없습니다. `make_metadata.py`와 `upload_tracker.py`는 Python 3.9 이상만 필요합니다. 나머지 두 스크립트는 커버를 위한 Pillow와 PDF를 위한 reportlab이라는 정확히 두 개의 패키지만 필요합니다.
제가 따랐으면 하는 순서는 다음과 같습니다: 폴더 레이아웃을 제대로 잡고, 메타데이터를 한 번 실행한 다음, 모든 업로드를 추적하고, 마지막으로 하나의 제품을 처음부터 끝까지 패키징하는 것입니다. 아이디어 하나당 반복 가능한 단계를 거치는 것이죠. 그러면 나머지 38개는 저렴해집니다.
저는 이 정확한 작업 방식과 그 39가지 제품을 만들어낸 스크립트를 포함하여 이 키트(kit)를 만들었습니다. 재작성이 아니라 동일한 코드입니다.
[키트 보기](https://revanzart-shop.revanzart.workers.dev/go/pipeline-starter-kit?src=devto)
_디지털 제품을 제작하시나요? [디지털 제품 판매자를 위한 무료 가이드 및 키트](https://revanzart-shop.revanzart.workers.dev/guides)._
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21