#!/bin/bash
#SBATCH --job-name=t2t_g
#SBATCH --output=./output/t2t_%n_%j.out
#SBATCH --error=./output/t2t_%n_%j.err
#SBATCH --nodes=1
#SBATCH --partition=gpu4
#SBATCH --gres=gpu:4
#SBATCH --cpus-per-task=16
#SBATCH --mem=128G
#SBATCH --time=24:00:00
echo "start at:" `date` # 접속한 날짜 표기
echo "node: $HOSTNAME" # 접속한 노드 번호 표기
echo "jobid: $SLURM_JOB_ID" # jobid 표기
# Load modules (cuda 환경)
module load cuda/11.8 #
# Load env (python 환경)
source ~/miniconda3/bin/activate ubai
pip install --upgrade pip # pip 최신 버전 유지
pip install -r requirements.txt # 필요 라이브러리 설치
# 스크립트 실행
python t2t.py
UBAI PRACTICE - T2T Generation
이번에는 텍스트 생성 프로젝트를 수행합니다.
Text-to-text Generation은, input과 output이 모두 텍스트(text)인 작업을 말합니다.
현재 Transformer에서 제공하는 언어 모델(Language Model) 중 가장 작은 모델인 GPT-2를 활용하여 진행해보겠습니다.
진행에 앞서, Transformer 라이브러리를 간단히 확인하고 넘어가겠습니다.
🤖 Transformer
먼저 Transformer는 2017년 구글 논문 “Attention Is All You Need”에서 처음 소개된 딥러닝 모델입니다. 주로 자연어 처리(NLP)에 사용되며, 기존의 RNN, LSTM보다 훨씬 강력하고 효율적인 모델이라고 할 수 있습니다.
Transformers 라이브러리는 Hugging Face에서 만든 자연어 처리(NLP) 및 인공지능 모델 라이브러리입니다. 라이브러리를 사용하면 복잡한 딥러닝 기반 AI 모델(예: BERT, GPT, T5 등)을 쉽게 불러와 사용할 수 있습니다.
1. 배치 파일 생성
프로젝트 수행을 위한 배치 파일을 생성합니다.
아래의 사항을 본인의 작업(job)에 맞게 입력한 후, 본인이 원하는 파일의 이름을 지정하여 filename.sh
형식으로 파일을 저장합니다. 예를 들어, 아래의 Shell 파일을 t2t.sh
로 저장해보겠습니다.
파일명이 .sh
형식인지 반드시 확인하세요.
결과값 도출 지정 폴더 이름을 반드시 지정해주세요. 각각 결과 값 폴더를 따로따로 만들어주거나 아니면 동일 폴더에 지정하셔도 됩니다.
STDOUT은 결과 값 출력 파일, STDERR는 결과 값 도출 중 출력 되는 로그 파일입니다. 새 폴더를 만들기 위해서는 디렉토리(directory)에서 오른쪽 버튼을 눌러 새 폴더 만들기 버튼을 클릭하시면 됩니다.
각 라인들의 의미는 다음과 같습니다.
✔ #SBATCH --nodes=1
- 총 필요 노드 수를 지정하는 명령어이며, 노드는 자동으로 컴퓨터가 배정해줍니다.
- nodes=1은 노드를 한 개만 사용하겠다는 의미입니다.
✔ #SBATCH --partition=gpu4
- 사용할 Partition을 지정하는 명령어입니다.
✔ #SBATCH --cpus-per-task=14
- 총 필요 코어의 개수를 지정하는 명령어입니다.
- 노드는 n개의 코어를 가지며, 사용 노드 1개 당 몇 개의 CPU/GPU 코어를 쓸 것인지를 결정합니다.
✔ #SBATCH --gres=gpu:1
- 몇 개의 GPU를 사용할 것인지 지정하는 명령어입니다.
- CPU Partition을 선택하신 경우 해당 코드는 지워주셔야 합니다. 해당 코드는 GPU의 개수를 지정하는 명령어이기에, 에러가 발생할 수 있습니다.
✔ #SBATCH --job-name=UBAIJOB
- 작업 이름을 지정하는 명령어입니다.
✔ echo "start at:" 'date'
- 접속 날짜가 표기됩니다.
✔ echo "node: $HOSTNAME"
- 접속한 노드 번호가 표기됩니다.
✔ echo "jobid: $SLURM_JOB_ID"
- jobid가 표기됩니다.
✔ module ~
- 원하는 Linux 환경을 구축할 수 있습니다.
- 기본적으로 CUDA/11.2.2 실행으로 셋팅되어 있습니다. 지금과 같이 다른 GPU 환경을 원할 경우, 해당 모듈을 unload한 후, 원하는 모듈을 load 합니다.
- GPU 환경을 사용하고 싶은 경우에만 해당하며, GPU 환경을 사용하지 않을 경우(CPU Partition 사용) 지우셔도 무관합니다.
✔ source ~/miniconda3/bin/activate ubai
- ubai라는 python 가상환경을 실행시킵니다.
- ubai는 임의로 작성한 가상환경으로, 본인이 생성한 가상환경의 이름을 입력하셔야 합니다.
- 이 때, activate하는 위치는 본인이 다운로드 받은 conda 경로로 설정되어야 합니다.
✔ pip install -r requirements.txt
- 실행시키고자하는 python 가상환경에, 필요한 라이브러리를 자동으로 다운받습니다.
- conda 가상환경을 만든 후, 사전에 필요 라이브러리를 모두 설치해두었다면, 별도로 작성할 필요가 없습니다.
✔ python t2t.py
- 원하는 Python 파일을 실행합니다.
- 실행하려는 파일은 반드시
.py
파일의 형태로 존재해야합니다.
2. 배치 파일 실행
배치 파일을 실행하기에 앞서, 본인이 생성했던 Python 가상 환경에 들어와 있는 상태인지 재 확인합니다.
이후, terminal에 sbatch
명령어를 이용하여 지정한 배치 파일명을 입력 및 실행하세요. 이는 작업(job)을 제출한다는 의미입니다.
실행 후 나온 결과 값은 작업(job)에 대한 ID이니 꼭 따로 저장하거나 메모해두시기를 요청드립니다.
sbatch t2t.sh # sbatch filename.sh
작업(job) 제출이 정상적으로 진행되었다면, STDOUT폴더 안에 OUT 파일이 생성됩니다.
만일 OUT파일이 생성되지 않았다면, 해당 Partition의 노드에 기존 작업(job)이 모두 할당되어 수행하지 못했을 가능성이 높습니다. 이 경우 terminal에 squeue
명령어를 입력하시고, 본인의 ID를 찾습니다.
보통 배정이 되어있다면 정상적으로 n001, n002 … 으로 노드에 배정되어 있지만, 배정되지 않았을 경우 ( Resources, Priority )라는 메시지를 볼 수 있습니다. 그런 경우 다른 노드가 일이 끝나는 것을 기다리거나, 해당 파티션이 아닌 다른 파티션을 이용하여 노드를 배정받아야 합니다.
다른 파티션을 이용하기 위해서는 Partition 목록에서 Partition과 cpus-per-task, gpu 갯수를 Partition에 맞게 수정하여 작업(job)을 다시 제출하셔야 합니다.
이제 STDOUT폴더에 생성된 실행 결과 OUT파일을 확인할 수 있습니다.