01. Main and Arguments
1. Overview
main(): 프로그램의 진입점으로, 사용자 입력에 따라 모델 초기화 및 실행 제어
- 주요 기능: 명령행 인자 처리, 실행 설정, 모델 초기화, 추론 실행 및 자원 해제
2. Argument Parsing
입력 예시
./run stories15M.bin -n 128 -t 0.8
| 입력 | 역할 | 적용 변수 |
|---|
stories15M.bin | 모델 체크포인트 경로 | checkpoint_path |
-n 128 | 최대 생성 단계 수 | steps |
-t 0.8 | Sampling Temperature | temperature |
- 모델 파일 경로는 첫 번째 인자로 전달
- 나머지 옵션은 옵션 이름과 값의 쌍으로 전달
- 입력된 옵션에 따라 기본 설정값 변경
기본 설정값
char *checkpoint_path = NULL;
char *tokenizer_path = "tokenizer.bin";
float temperature = 1.0f;
float topp = 0.9f;
int steps = 256;
char *prompt = NULL;
unsigned long long rng_seed = 0;
char *mode = "generate";
char *system_prompt = NULL;
- 사용자 옵션이 없으면 기본값 적용
- 모델 경로는 필수 입력
입력 처리
if (argc >= 2) { checkpoint_path = argv[1]; }
else { error_usage(); }
for (int i = 2; i < argc; i+=2) {
if (i + 1 >= argc) { error_usage(); }
if (argv[i][0] != '-') { error_usage(); }
if (strlen(argv[i]) != 2) { error_usage(); }
if (argv[i][1] == 't') { temperature = atof(argv[i + 1]); }
else if (argv[i][1] == 'p') { topp = atof(argv[i + 1]); }
else if (argv[i][1] == 's') { rng_seed = atoi(argv[i + 1]); }
else if (argv[i][1] == 'n') { steps = atoi(argv[i + 1]); }
else if (argv[i][1] == 'i') { prompt = argv[i + 1]; }
else if (argv[i][1] == 'z') { tokenizer_path = argv[i + 1]; }
else if (argv[i][1] == 'm') { mode = argv[i + 1]; }
else if (argv[i][1] == 'y') { system_prompt = argv[i + 1]; }
else { error_usage(); }
}
- 모델 경로 존재 여부 확인
- 옵션 이름과 값을 순차적으로 처리
- 옵션 종류에 따라 해당 실행 변수 설정
3. Argument Validation
if (rng_seed <= 0) rng_seed = (unsigned int)time(NULL);
if (temperature < 0.0) temperature = 0.0;
if (topp < 0.0 || 1.0 < topp) topp = 0.9;
if (steps < 0) steps = 0;
- 난수 시드 및 Sampling 관련 입력값 보정
steps는 모델 초기화 후 seq_len을 기준으로 추가 조정
4. Model Initialization
Transformer transformer;
build_transformer(&transformer, checkpoint_path);
Tokenizer tokenizer;
build_tokenizer(&tokenizer, tokenizer_path, transformer.config.vocab_size);
Sampler sampler;
build_sampler(&sampler, transformer.config.vocab_size, temperature, topp, rng_seed);
| 함수 | 전달 정보 | 역할 |
|---|
build_transformer() | Checkpoint 경로 | 모델 가중치 및 추론 메모리 준비 |
build_tokenizer() | Tokenizer 경로, Vocabulary 크기 | 텍스트 토큰화 준비 |
build_sampler() | Vocabulary 크기, Temperature, Top-p, Seed | 다음 토큰 선택 방식 설정 |
5. Model Execution
if (strcmp(mode, "generate") == 0) {
generate(&transformer, &tokenizer, &sampler, prompt, steps);
} else if (strcmp(mode, "chat") == 0) {
chat(&transformer, &tokenizer, &sampler, prompt, system_prompt, steps);
} else {
fprintf(stderr, "unknown mode: %s\n", mode);
error_usage();
}
generate(): 일반 텍스트 생성
chat(): 채팅 형식의 텍스트 생성
- 두 모드 모두 Transformer 추론과 Sampling을 활용
6. Cleanup
free_sampler(&sampler);
free_tokenizer(&tokenizer);
free_transformer(&transformer);
return 0;
7. Execution Flow
Command-Line Input
↓
main(argc, argv)
↓
Argument Parsing
↓
Argument Validation
↓
Model Initialization
├── build_transformer()
├── build_tokenizer()
└── build_sampler()
↓
Model Execution
├── generate()
└── chat()
↓
Memory Cleanup
↓
Program Exit