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.8Sampling Temperaturetemperature
  • 모델 파일 경로는 첫 번째 인자로 전달
  • 나머지 옵션은 옵션 이름과 값의 쌍으로 전달
  • 입력된 옵션에 따라 기본 설정값 변경

기본 설정값

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