import gradio as gr import threading from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments from datasets import load_dataset # 데이터셋 로딩 dataset = load_dataset("imdb") # 모델과 토크나이저 로딩 model_name = "distilbert-base-uncased" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSequenceClassification.from_pretrained(model_name) # 데이터셋을 모델에 맞게 전처리 def tokenize_function(examples): return tokenizer(examples["text"], padding="max_length", truncation=True) tokenized_train_datasets = dataset["train"].map(tokenize_function, batched=True) tokenized_test_datasets = dataset["test"].map(tokenize_function, batched=True) # 훈련 설정 (빠르게 훈련하기 위해 에폭 수를 줄임) training_args = TrainingArguments( output_dir="./results", # 결과 저장 경로 num_train_epochs=1, # 훈련 에폭 수 1로 설정 (빠르게 테스트) per_device_train_batch_size=16, # 배치 크기 증가 per_device_eval_batch_size=16, # 배치 크기 증가 evaluation_strategy="epoch", # 에폭마다 검증 logging_dir="./logs", # 로그 저장 경로 logging_steps=100, # 100 스텝마다 로그 출력 report_to="tensorboard", # 텐서보드로 로그 보고 load_best_model_at_end=True, # 최상의 모델로 종료 ) # 훈련 함수 def train_model(): trainer = Trainer( model=model, # 훈련할 모델 args=training_args, # 훈련 인자 train_dataset=tokenized_train_datasets, # 훈련 데이터셋 eval_dataset=tokenized_test_datasets, # 평가 데이터셋 ) trainer.train() # 훈련을 별도의 스레드에서 실행 def start_training(): train_thread = threading.Thread(target=train_model) train_thread.start() # 그라디언트 기반 훈련된 모델을 UI에 연결 def classify_text(text): inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True) outputs = model(**inputs) logits = outputs.logits predicted_class = logits.argmax(-1).item() return predicted_class # Gradio 인터페이스 설정 demo = gr.Interface(fn=classify_text, inputs="text", outputs="text") # 훈련 시작과 Gradio UI 실행 def launch_app(): # 훈련을 시작 start_training() # Gradio 인터페이스 실행 demo.launch() # 허깅페이스 Spaces에 업로드 할 때는 이 부분을 실행하도록 설정 if __name__ == "__main__": launch_app()