Delete kcmii_lm_test.ipynb
Browse files- kcmii_lm_test.ipynb +0 -1104
kcmii_lm_test.ipynb
DELETED
|
@@ -1,1104 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"cells": [
|
| 3 |
-
{
|
| 4 |
-
"cell_type": "code",
|
| 5 |
-
"execution_count": 2,
|
| 6 |
-
"id": "89eeae89-a93f-4afd-be82-7299362efd13",
|
| 7 |
-
"metadata": {},
|
| 8 |
-
"outputs": [
|
| 9 |
-
{
|
| 10 |
-
"name": "stdout",
|
| 11 |
-
"output_type": "stream",
|
| 12 |
-
"text": [
|
| 13 |
-
"Collecting torch\n",
|
| 14 |
-
" Downloading torch-2.7.0-cp310-none-macosx_11_0_arm64.whl.metadata (29 kB)\n",
|
| 15 |
-
"Collecting transformers\n",
|
| 16 |
-
" Downloading transformers-4.51.3-py3-none-any.whl.metadata (38 kB)\n",
|
| 17 |
-
"Requirement already satisfied: filelock in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from torch) (3.18.0)\n",
|
| 18 |
-
"Requirement already satisfied: typing-extensions>=4.10.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from torch) (4.12.2)\n",
|
| 19 |
-
"Collecting sympy>=1.13.3 (from torch)\n",
|
| 20 |
-
" Downloading sympy-1.14.0-py3-none-any.whl.metadata (12 kB)\n",
|
| 21 |
-
"Collecting networkx (from torch)\n",
|
| 22 |
-
" Downloading networkx-3.4.2-py3-none-any.whl.metadata (6.3 kB)\n",
|
| 23 |
-
"Requirement already satisfied: jinja2 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from torch) (3.1.6)\n",
|
| 24 |
-
"Requirement already satisfied: fsspec in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from torch) (2025.3.0)\n",
|
| 25 |
-
"Requirement already satisfied: huggingface-hub<1.0,>=0.30.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from transformers) (0.30.2)\n",
|
| 26 |
-
"Requirement already satisfied: numpy>=1.17 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from transformers) (2.2.5)\n",
|
| 27 |
-
"Requirement already satisfied: packaging>=20.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from transformers) (24.2)\n",
|
| 28 |
-
"Requirement already satisfied: pyyaml>=5.1 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from transformers) (6.0.2)\n",
|
| 29 |
-
"Collecting regex!=2019.12.17 (from transformers)\n",
|
| 30 |
-
" Downloading regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl.metadata (40 kB)\n",
|
| 31 |
-
"Requirement already satisfied: requests in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from transformers) (2.32.3)\n",
|
| 32 |
-
"Collecting tokenizers<0.22,>=0.21 (from transformers)\n",
|
| 33 |
-
" Downloading tokenizers-0.21.1-cp39-abi3-macosx_11_0_arm64.whl.metadata (6.8 kB)\n",
|
| 34 |
-
"Collecting safetensors>=0.4.3 (from transformers)\n",
|
| 35 |
-
" Downloading safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl.metadata (3.8 kB)\n",
|
| 36 |
-
"Requirement already satisfied: tqdm>=4.27 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from transformers) (4.67.1)\n",
|
| 37 |
-
"Collecting mpmath<1.4,>=1.1.0 (from sympy>=1.13.3->torch)\n",
|
| 38 |
-
" Downloading mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB)\n",
|
| 39 |
-
"Requirement already satisfied: MarkupSafe>=2.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from jinja2->torch) (3.0.2)\n",
|
| 40 |
-
"Requirement already satisfied: charset-normalizer<4,>=2 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from requests->transformers) (3.3.2)\n",
|
| 41 |
-
"Requirement already satisfied: idna<4,>=2.5 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from requests->transformers) (3.7)\n",
|
| 42 |
-
"Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from requests->transformers) (2.3.0)\n",
|
| 43 |
-
"Requirement already satisfied: certifi>=2017.4.17 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from requests->transformers) (2025.4.26)\n",
|
| 44 |
-
"Downloading torch-2.7.0-cp310-none-macosx_11_0_arm64.whl (68.6 MB)\n",
|
| 45 |
-
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m68.6/68.6 MB\u001b[0m \u001b[31m58.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
|
| 46 |
-
"Downloading transformers-4.51.3-py3-none-any.whl (10.4 MB)\n",
|
| 47 |
-
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m10.4/10.4 MB\u001b[0m \u001b[31m55.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
| 48 |
-
"\u001b[?25hDownloading regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl (284 kB)\n",
|
| 49 |
-
"Downloading safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl (418 kB)\n",
|
| 50 |
-
"Downloading sympy-1.14.0-py3-none-any.whl (6.3 MB)\n",
|
| 51 |
-
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.3/6.3 MB\u001b[0m \u001b[31m54.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
| 52 |
-
"Downloading tokenizers-0.21.1-cp39-abi3-macosx_11_0_arm64.whl (2.7 MB)\n",
|
| 53 |
-
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━���━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.7/2.7 MB\u001b[0m \u001b[31m49.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
| 54 |
-
"\u001b[?25hDownloading networkx-3.4.2-py3-none-any.whl (1.7 MB)\n",
|
| 55 |
-
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.7/1.7 MB\u001b[0m \u001b[31m45.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
| 56 |
-
"Downloading mpmath-1.3.0-py3-none-any.whl (536 kB)\n",
|
| 57 |
-
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m536.2/536.2 kB\u001b[0m \u001b[31m21.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
|
| 58 |
-
"Installing collected packages: mpmath, sympy, safetensors, regex, networkx, torch, tokenizers, transformers\n",
|
| 59 |
-
"Successfully installed mpmath-1.3.0 networkx-3.4.2 regex-2024.11.6 safetensors-0.5.3 sympy-1.14.0 tokenizers-0.21.1 torch-2.7.0 transformers-4.51.3\n"
|
| 60 |
-
]
|
| 61 |
-
}
|
| 62 |
-
],
|
| 63 |
-
"source": [
|
| 64 |
-
"# 모델 임포트와 테스트의 기본 패키지 설치\n",
|
| 65 |
-
"!pip install torch transformers"
|
| 66 |
-
]
|
| 67 |
-
},
|
| 68 |
-
{
|
| 69 |
-
"cell_type": "code",
|
| 70 |
-
"execution_count": 1,
|
| 71 |
-
"id": "e710baec-6288-410c-9ca3-28ab64064613",
|
| 72 |
-
"metadata": {},
|
| 73 |
-
"outputs": [
|
| 74 |
-
{
|
| 75 |
-
"name": "stdout",
|
| 76 |
-
"output_type": "stream",
|
| 77 |
-
"text": [
|
| 78 |
-
"MPS 사용 가능 여부: True\n",
|
| 79 |
-
"MPS 준비 완료 여부: True\n"
|
| 80 |
-
]
|
| 81 |
-
}
|
| 82 |
-
],
|
| 83 |
-
"source": [
|
| 84 |
-
"import torch\n",
|
| 85 |
-
"print(\"MPS 사용 가능 여부:\", torch.backends.mps.is_available())\n",
|
| 86 |
-
"print(\"MPS 준비 완료 여부:\", torch.backends.mps.is_built())"
|
| 87 |
-
]
|
| 88 |
-
},
|
| 89 |
-
{
|
| 90 |
-
"cell_type": "code",
|
| 91 |
-
"execution_count": 1,
|
| 92 |
-
"id": "00c17b86-2c03-4d87-99aa-47511bab5715",
|
| 93 |
-
"metadata": {},
|
| 94 |
-
"outputs": [
|
| 95 |
-
{
|
| 96 |
-
"name": "stderr",
|
| 97 |
-
"output_type": "stream",
|
| 98 |
-
"text": [
|
| 99 |
-
"/opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
|
| 100 |
-
" from .autonotebook import tqdm as notebook_tqdm\n"
|
| 101 |
-
]
|
| 102 |
-
},
|
| 103 |
-
{
|
| 104 |
-
"ename": "NameError",
|
| 105 |
-
"evalue": "name 'torch' is not defined",
|
| 106 |
-
"output_type": "error",
|
| 107 |
-
"traceback": [
|
| 108 |
-
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
| 109 |
-
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
|
| 110 |
-
"Cell \u001b[0;32mIn[1], line 7\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01mtransformers\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m AutoTokenizer, AutoModelForCausalLM\n\u001b[1;32m 4\u001b[0m \u001b[38;5;66;03m# 디바이스 설정 (해당 기기에서 mps가 사용가능한지 확인)\u001b[39;00m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;66;03m# 확인 후 모델/데이터를 gpu / cpu로 할지 결정\u001b[39;00m\n\u001b[1;32m 6\u001b[0m \u001b[38;5;66;03m# torch.backends.mps.is_available() -> mps 사용 여부 확인\u001b[39;00m\n\u001b[0;32m----> 7\u001b[0m device \u001b[38;5;241m=\u001b[39m \u001b[43mtorch\u001b[49m\u001b[38;5;241m.\u001b[39mdevice(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmps\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m torch\u001b[38;5;241m.\u001b[39mbackends\u001b[38;5;241m.\u001b[39mmps\u001b[38;5;241m.\u001b[39mis_available() \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcpu\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 8\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m사용 중인 디바이스:\u001b[39m\u001b[38;5;124m\"\u001b[39m, device)\n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m# 모델 불러오기\u001b[39;00m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;66;03m# model_name 허깅페이스에서 불러올 모델 지정\u001b[39;00m\n",
|
| 111 |
-
"\u001b[0;31mNameError\u001b[0m: name 'torch' is not defined"
|
| 112 |
-
]
|
| 113 |
-
}
|
| 114 |
-
],
|
| 115 |
-
"source": [
|
| 116 |
-
"# 허깅페이스에 있는 모델을 임포트 및 토크나이저 로딩용 도구 불러오기\n",
|
| 117 |
-
"from transformers import AutoTokenizer, AutoModelForCausalLM\n",
|
| 118 |
-
"\n",
|
| 119 |
-
"# 디바이스 설정 (해당 기기에서 mps가 사용가능한지 확인)\n",
|
| 120 |
-
"# 확인 후 모델/데이터를 gpu / cpu로 할지 결정\n",
|
| 121 |
-
"# torch.backends.mps.is_available() -> mps 사용 여부 확인\n",
|
| 122 |
-
"device = torch.device(\"mps\" if torch.backends.mps.is_available() else \"cpu\")\n",
|
| 123 |
-
"print(\"사용 중인 디바이스:\", device)\n",
|
| 124 |
-
"\n",
|
| 125 |
-
"# 모델 불러오기\n",
|
| 126 |
-
"# model_name 허깅페이스에서 불러올 모델 지정\n",
|
| 127 |
-
"model_name = \"EleutherAI/polyglot-ko-1.3b\"\n",
|
| 128 |
-
"# 해당 모델과 호환되는 토크나이저(문자��� -> 숫자 변환기) 불러오기 ## 토크나이저에 대해서 알기\n",
|
| 129 |
-
"## 자연어를 모델이 이해할 수 있는 숫자 토큰으로 바꾸는 도구\n",
|
| 130 |
-
"## 단지 토크나이저는 단어를 숫자화해서 명명한 도구일 뿐 어떠한 의미도 없음\n",
|
| 131 |
-
"## +) 임베딩은 단어의 의미가 담겨 있는 벡터 공간\n",
|
| 132 |
-
"tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
|
| 133 |
-
"# 텍스트 생성용 모델 불러오기 / to(device) 모델을 아까 설정한 디바이스로 이동\n",
|
| 134 |
-
"model = AutoModelForCausalLM.from_pretrained(model_name).to(device)\n",
|
| 135 |
-
"\n",
|
| 136 |
-
"# 사용자가 입력할 텍스트 또는 입력값\n",
|
| 137 |
-
"prompt = \"어문학이란 무엇인가?\\n해석:\"\n",
|
| 138 |
-
"\n",
|
| 139 |
-
"# 입력값을 토크나이저를 통해 숫자 토큰으로 변환\n",
|
| 140 |
-
"# return_tensors=\"pt\" 입력값을 숫자 토큰화하여 파이토지 텐서 형태로 리턴\n",
|
| 141 |
-
"inputs = tokenizer(prompt, return_tensors=\"pt\").to(device)\n",
|
| 142 |
-
"\n",
|
| 143 |
-
"# GPT 모델에 불필요한 token_type_ids 제거\n",
|
| 144 |
-
"# 토큰화하면 어떻게 나오길래 궁금하기도 하고\n",
|
| 145 |
-
"# gpt 모델과 bert모델이랑 머가 다른지도 확인해서 왜 불필요한지 확인이 필요함\n",
|
| 146 |
-
"# {\n",
|
| 147 |
-
"# 'input_ids': tensor([[ 101, ... , 102]]),\n",
|
| 148 |
-
"# 'attention_mask': tensor([[1, 1, 1, ...]]),\n",
|
| 149 |
-
"# 'token_type_ids': tensor([[0, 0, 0, ...]])\n",
|
| 150 |
-
"# }\n",
|
| 151 |
-
"# input_ids : 단어를 숫자로 바꾼 결과\n",
|
| 152 |
-
"# attetion_mask : 실제 단어(1) vs 패딩(0) 구분\n",
|
| 153 |
-
"# token_type_ids : 두 문장을 구분하기 위한 segment ID\n",
|
| 154 |
-
"\n",
|
| 155 |
-
"# [CLS] 나는 사과를 먹었다 [SEP] 하지만 배는 안 먹었다 [SEP]\n",
|
| 156 |
-
"# ↑ 문장 A ↑ 문장 B\n",
|
| 157 |
-
"# token_type_ids: [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]\n",
|
| 158 |
-
"\n",
|
| 159 |
-
"# gpt는 입력 자체가 항상 하나의 연속된 문장 스퀀스이기 때문에 문장 구분이 필요없음\n",
|
| 160 |
-
"if 'token_type_ids' in inputs:\n",
|
| 161 |
-
" inputs.pop('token_type_ids')\n",
|
| 162 |
-
"\n",
|
| 163 |
-
"# torch.no_grad() 추론 시에는 기울기 게산하지 않게하여 속도/메모리 절약 -> 왜 이렇게 해야하나?\n",
|
| 164 |
-
"with torch.no_grad():\n",
|
| 165 |
-
" # model.generate() 주어진 입력에 대해 텍스트를 생성함\n",
|
| 166 |
-
" ## 자세한 내용과 이해는 노션 참고\n",
|
| 167 |
-
" outputs = model.generate(\n",
|
| 168 |
-
" **inputs,\n",
|
| 169 |
-
" # 최대 80개의 새로운 토큰 생성\n",
|
| 170 |
-
" ## 모델이 새로 생성할 최대 토큰의 개수\n",
|
| 171 |
-
" max_new_tokens=100,\n",
|
| 172 |
-
" # 확률 기반 샘플링 활성화\n",
|
| 173 |
-
" ## 모델이 다음 토큰을 선택할 때 가장 확률 높은 단어를 무조건 고르는 것이 아니라 확률 분포에서 무작위로 하나 샘플링\n",
|
| 174 |
-
" do_sample=True,\n",
|
| 175 |
-
" # 확률 높은 상위 50개 중에서 선택\n",
|
| 176 |
-
" ## 샘플링할 때 상위 k개의 단어만으로 후보를 제한\n",
|
| 177 |
-
" top_k=50,\n",
|
| 178 |
-
" # 누적 확률 95%까지 포함한 후보군에서 선택\n",
|
| 179 |
-
" ## 상위 단위들의 누적화률이 95% 넘을 때까지 후보군을 누적시킴, 그 안에서 샘플링\n",
|
| 180 |
-
" top_p=0.95,\n",
|
| 181 |
-
" # 창의성 조절 값\n",
|
| 182 |
-
" temperature=0.8\n",
|
| 183 |
-
" )\n",
|
| 184 |
-
"\n",
|
| 185 |
-
"# 토큰을 텍스트로 디코딩\n",
|
| 186 |
-
"# 모델이 생성한 토큰 시퀀스 중 첫번 째 결과를\n",
|
| 187 |
-
"# skip_special_tokens=True 특수토큰 제거\n",
|
| 188 |
-
"result = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
|
| 189 |
-
"print(\"\\n📄 생성된 문장:\\n\")\n",
|
| 190 |
-
"print(result)"
|
| 191 |
-
]
|
| 192 |
-
},
|
| 193 |
-
{
|
| 194 |
-
"cell_type": "code",
|
| 195 |
-
"execution_count": 3,
|
| 196 |
-
"id": "ca568fec-565c-434f-98a2-4d3830768f61",
|
| 197 |
-
"metadata": {},
|
| 198 |
-
"outputs": [
|
| 199 |
-
{
|
| 200 |
-
"name": "stderr",
|
| 201 |
-
"output_type": "stream",
|
| 202 |
-
"text": [
|
| 203 |
-
"Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n"
|
| 204 |
-
]
|
| 205 |
-
},
|
| 206 |
-
{
|
| 207 |
-
"name": "stdout",
|
| 208 |
-
"output_type": "stream",
|
| 209 |
-
"text": [
|
| 210 |
-
"\n",
|
| 211 |
-
"📄 생성된 문장:\n",
|
| 212 |
-
"\n",
|
| 213 |
-
"너는 어떤 모델이니?\n",
|
| 214 |
-
"해석: 너는 그의 몸을 숨기고 그의 몸을 팔고 있구나.번역: 너는 나의 몸을 팔고 있구나. עָרָהָה לִפְנֵי הָאֹת רָחָה־מָיִם עֹ�\n"
|
| 215 |
-
]
|
| 216 |
-
}
|
| 217 |
-
],
|
| 218 |
-
"source": [
|
| 219 |
-
"# 사용자가 입력할 텍스트 또는 입력값\n",
|
| 220 |
-
"prompt = \"너는 어떤 모델이니?\\n해석:\"\n",
|
| 221 |
-
"\n",
|
| 222 |
-
"# 입력값을 토크나이저를 통해 숫자 토큰으로 변환\n",
|
| 223 |
-
"inputs = tokenizer(prompt, return_tensors=\"pt\").to(device)\n",
|
| 224 |
-
"\n",
|
| 225 |
-
"# gpt는 입력 자체가 항상 하나의 연속된 문장 스퀀스이기 때문에 문장 구분이 필요없음\n",
|
| 226 |
-
"if 'token_type_ids' in inputs:\n",
|
| 227 |
-
" inputs.pop('token_type_ids')\n",
|
| 228 |
-
"\n",
|
| 229 |
-
"# torch.no_grad() 추론 시에는 기울기 게산하지 않게하여 속도/메모리 절약 -> 왜 이렇게 해야하나?\n",
|
| 230 |
-
"with torch.no_grad():\n",
|
| 231 |
-
" # model.generate() 주어진 입력에 대해 텍스트를 생성함\n",
|
| 232 |
-
" ## 자세한 내용과 이해는 노션 참고\n",
|
| 233 |
-
" outputs = model.generate(\n",
|
| 234 |
-
" **inputs,\n",
|
| 235 |
-
" # 최대 80개의 새로운 토큰 생성\n",
|
| 236 |
-
" ## 모델이 새로 생성할 최대 토큰의 개수\n",
|
| 237 |
-
" max_new_tokens=100,\n",
|
| 238 |
-
" # 확률 기반 샘플링 활성화\n",
|
| 239 |
-
" ## 모델이 다음 토큰을 선택할 때 가장 확률 높은 단어를 무조건 고르는 것이 아니라 확률 분포에서 무작위로 하나 샘플링\n",
|
| 240 |
-
" do_sample=True,\n",
|
| 241 |
-
" # 확률 높은 상위 50개 중에서 선택\n",
|
| 242 |
-
" ## 샘플링할 때 상위 k개의 단어만으로 후보를 제한\n",
|
| 243 |
-
" top_k=50,\n",
|
| 244 |
-
" # 누적 확률 95%까지 포함한 후보군에서 선택\n",
|
| 245 |
-
" ## 상위 단위들의 누적화률이 95% 넘을 때까지 후보군을 누적시킴, 그 안에서 샘플링\n",
|
| 246 |
-
" top_p=0.95,\n",
|
| 247 |
-
" # 창의성 조절 값\n",
|
| 248 |
-
" temperature=0.8\n",
|
| 249 |
-
" )\n",
|
| 250 |
-
"\n",
|
| 251 |
-
"# 토큰을 텍스트로 디코딩\n",
|
| 252 |
-
"# 모델이 생성한 토큰 시퀀스 중 첫번 째 결과를\n",
|
| 253 |
-
"# skip_special_tokens=True 특수토큰 제거\n",
|
| 254 |
-
"result = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
|
| 255 |
-
"print(\"\\n📄 생성된 문장:\\n\")\n",
|
| 256 |
-
"print(result)"
|
| 257 |
-
]
|
| 258 |
-
},
|
| 259 |
-
{
|
| 260 |
-
"cell_type": "markdown",
|
| 261 |
-
"id": "c01a9f6f-9eb4-4917-bc18-3c33674b7a57",
|
| 262 |
-
"metadata": {},
|
| 263 |
-
"source": [
|
| 264 |
-
"### kcmii 지침서로 경량 학습 후 성능 테스트\n",
|
| 265 |
-
"kcmii의 전공의 수가 50개 정도되기 때문에 \n",
|
| 266 |
-
"전공 흥미척도 조합별로 생기부 문구를 학습시키기엔 비효율적이라고 판단 \n",
|
| 267 |
-
"그렇기 때문에 전공에 대한 개념 먼저 학습 시킨 후 생기부 문구 학습시키는 흐름으로 결정"
|
| 268 |
-
]
|
| 269 |
-
},
|
| 270 |
-
{
|
| 271 |
-
"cell_type": "code",
|
| 272 |
-
"execution_count": 30,
|
| 273 |
-
"id": "56bcb149-6237-487e-b93d-dd21889ce93f",
|
| 274 |
-
"metadata": {},
|
| 275 |
-
"outputs": [
|
| 276 |
-
{
|
| 277 |
-
"name": "stderr",
|
| 278 |
-
"output_type": "stream",
|
| 279 |
-
"text": [
|
| 280 |
-
"huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
|
| 281 |
-
"To disable this warning, you can either:\n",
|
| 282 |
-
"\t- Avoid using `tokenizers` before the fork if possible\n",
|
| 283 |
-
"\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n"
|
| 284 |
-
]
|
| 285 |
-
},
|
| 286 |
-
{
|
| 287 |
-
"name": "stdout",
|
| 288 |
-
"output_type": "stream",
|
| 289 |
-
"text": [
|
| 290 |
-
"Requirement already satisfied: datasets in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (3.5.1)\n",
|
| 291 |
-
"Requirement already satisfied: peft in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (0.15.2)\n",
|
| 292 |
-
"Requirement already satisfied: accelerate in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (1.6.0)\n",
|
| 293 |
-
"Requirement already satisfied: filelock in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from datasets) (3.18.0)\n",
|
| 294 |
-
"Requirement already satisfied: numpy>=1.17 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from datasets) (2.2.5)\n",
|
| 295 |
-
"Requirement already satisfied: pyarrow>=15.0.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from datasets) (20.0.0)\n",
|
| 296 |
-
"Requirement already satisfied: dill<0.3.9,>=0.3.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from datasets) (0.3.8)\n",
|
| 297 |
-
"Requirement already satisfied: pandas in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from datasets) (2.2.3)\n",
|
| 298 |
-
"Requirement already satisfied: requests>=2.32.2 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from datasets) (2.32.3)\n",
|
| 299 |
-
"Requirement already satisfied: tqdm>=4.66.3 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from datasets) (4.67.1)\n",
|
| 300 |
-
"Requirement already satisfied: xxhash in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from datasets) (3.5.0)\n",
|
| 301 |
-
"Requirement already satisfied: multiprocess<0.70.17 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from datasets) (0.70.16)\n",
|
| 302 |
-
"Requirement already satisfied: fsspec<=2025.3.0,>=2023.1.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (2025.3.0)\n",
|
| 303 |
-
"Requirement already satisfied: aiohttp in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from datasets) (3.11.18)\n",
|
| 304 |
-
"Requirement already satisfied: huggingface-hub>=0.24.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from datasets) (0.30.2)\n",
|
| 305 |
-
"Requirement already satisfied: packaging in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from datasets) (24.2)\n",
|
| 306 |
-
"Requirement already satisfied: pyyaml>=5.1 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from datasets) (6.0.2)\n",
|
| 307 |
-
"Requirement already satisfied: psutil in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from peft) (5.9.0)\n",
|
| 308 |
-
"Requirement already satisfied: torch>=1.13.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from peft) (2.7.0)\n",
|
| 309 |
-
"Requirement already satisfied: transformers in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from peft) (4.51.3)\n",
|
| 310 |
-
"Requirement already satisfied: safetensors in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from peft) (0.5.3)\n",
|
| 311 |
-
"Requirement already satisfied: aiohappyeyeballs>=2.3.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from aiohttp->datasets) (2.6.1)\n",
|
| 312 |
-
"Requirement already satisfied: aiosignal>=1.1.2 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from aiohttp->datasets) (1.3.2)\n",
|
| 313 |
-
"Requirement already satisfied: async-timeout<6.0,>=4.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from aiohttp->datasets) (5.0.1)\n",
|
| 314 |
-
"Requirement already satisfied: attrs>=17.3.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from aiohttp->datasets) (24.3.0)\n",
|
| 315 |
-
"Requirement already satisfied: frozenlist>=1.1.1 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from aiohttp->datasets) (1.6.0)\n",
|
| 316 |
-
"Requirement already satisfied: multidict<7.0,>=4.5 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from aiohttp->datasets) (6.4.3)\n",
|
| 317 |
-
"Requirement already satisfied: propcache>=0.2.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from aiohttp->datasets) (0.3.1)\n",
|
| 318 |
-
"Requirement already satisfied: yarl<2.0,>=1.17.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from aiohttp->datasets) (1.20.0)\n",
|
| 319 |
-
"Requirement already satisfied: typing-extensions>=3.7.4.3 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from huggingface-hub>=0.24.0->datasets) (4.12.2)\n",
|
| 320 |
-
"Requirement already satisfied: charset-normalizer<4,>=2 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from requests>=2.32.2->datasets) (3.3.2)\n",
|
| 321 |
-
"Requirement already satisfied: idna<4,>=2.5 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from requests>=2.32.2->datasets) (3.7)\n",
|
| 322 |
-
"Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from requests>=2.32.2->datasets) (2.3.0)\n",
|
| 323 |
-
"Requirement already satisfied: certifi>=2017.4.17 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from requests>=2.32.2->datasets) (2025.4.26)\n",
|
| 324 |
-
"Requirement already satisfied: sympy>=1.13.3 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from torch>=1.13.0->peft) (1.14.0)\n",
|
| 325 |
-
"Requirement already satisfied: networkx in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from torch>=1.13.0->peft) (3.4.2)\n",
|
| 326 |
-
"Requirement already satisfied: jinja2 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from torch>=1.13.0->peft) (3.1.6)\n",
|
| 327 |
-
"Requirement already satisfied: python-dateutil>=2.8.2 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from pandas->datasets) (2.9.0.post0)\n",
|
| 328 |
-
"Requirement already satisfied: pytz>=2020.1 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from pandas->datasets) (2025.2)\n",
|
| 329 |
-
"Requirement already satisfied: tzdata>=2022.7 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from pandas->datasets) (2025.2)\n",
|
| 330 |
-
"Requirement already satisfied: regex!=2019.12.17 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from transformers->peft) (2024.11.6)\n",
|
| 331 |
-
"Requirement already satisfied: tokenizers<0.22,>=0.21 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from transformers->peft) (0.21.1)\n",
|
| 332 |
-
"Requirement already satisfied: six>=1.5 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from python-dateutil>=2.8.2->pandas->datasets) (1.17.0)\n",
|
| 333 |
-
"Requirement already satisfied: mpmath<1.4,>=1.1.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from sympy>=1.13.3->torch>=1.13.0->peft) (1.3.0)\n",
|
| 334 |
-
"Requirement already satisfied: MarkupSafe>=2.0 in /opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages (from jinja2->torch>=1.13.0->peft) (3.0.2)\n"
|
| 335 |
-
]
|
| 336 |
-
}
|
| 337 |
-
],
|
| 338 |
-
"source": [
|
| 339 |
-
"!pip install datasets peft accelerate"
|
| 340 |
-
]
|
| 341 |
-
},
|
| 342 |
-
{
|
| 343 |
-
"cell_type": "code",
|
| 344 |
-
"execution_count": 1,
|
| 345 |
-
"id": "1f0a84f9-8f1d-4863-a25f-cf8349b3a67f",
|
| 346 |
-
"metadata": {},
|
| 347 |
-
"outputs": [
|
| 348 |
-
{
|
| 349 |
-
"name": "stderr",
|
| 350 |
-
"output_type": "stream",
|
| 351 |
-
"text": [
|
| 352 |
-
"/opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
|
| 353 |
-
" from .autonotebook import tqdm as notebook_tqdm\n",
|
| 354 |
-
"Loading checkpoint shards: 100%|██████████| 3/3 [00:01<00:00, 1.68it/s]\n"
|
| 355 |
-
]
|
| 356 |
-
}
|
| 357 |
-
],
|
| 358 |
-
"source": [
|
| 359 |
-
"# 허깅페이스에서 데이터셋을 불러오거나, 로컬에서 데이터를 쉽게 학습용으로 셋팅하게 하는 패키지\n",
|
| 360 |
-
"from datasets import load_dataset\n",
|
| 361 |
-
"# AutoTokenizer 텍스트를 숫자 id로 변환\n",
|
| 362 |
-
"# AutoModelForCausalLM GPT류 생성 모델을 불러오기 위한 클래스\n",
|
| 363 |
-
"# TrainingArguments 학습 설정을 담는 객체\n",
|
| 364 |
-
"# Trainer 학습 전체를 담당하는 학습 엔진\n",
|
| 365 |
-
"from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer\n",
|
| 366 |
-
"# peft 경량튜닝 LoRA 관련 도구 임포트\n",
|
| 367 |
-
"from peft import get_peft_model, LoraConfig, TaskType\n",
|
| 368 |
-
"\n",
|
| 369 |
-
"# 1. 로컬에서 학습 데이터 로드\n",
|
| 370 |
-
"dataset = load_dataset(\"json\", data_files=\"dataset/kcmii_major_instruction_data_summarized.jsonl\", split=\"train\")\n",
|
| 371 |
-
"\n",
|
| 372 |
-
"# 2. 모델 및 토크나이저 로딩\n",
|
| 373 |
-
"## 모델 임포트\n",
|
| 374 |
-
"model_name = \"EleutherAI/polyglot-ko-1.3b\"\n",
|
| 375 |
-
"## 모델에 알맞은 토크나이저 임포트\n",
|
| 376 |
-
"tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
|
| 377 |
-
"## 불러온 모델을 mps에 올려 학습 및 추론할 준비\n",
|
| 378 |
-
"model = AutoModelForCausalLM.from_pretrained(model_name).to(\"mps\")\n",
|
| 379 |
-
"\n",
|
| 380 |
-
"# 3. LoRA 경량 학습 설정\n",
|
| 381 |
-
"peft_config = LoraConfig(\n",
|
| 382 |
-
" ## causal_lm = GPT류는 왼쪽->오른쪽으로 문장 생성하는 구조, 이에 맞춰 LoRA 삽입위치를 결정하기 위해\n",
|
| 383 |
-
" ## 모델 구조 명시\n",
|
| 384 |
-
" task_type=TaskType.CAUSAL_LM,\n",
|
| 385 |
-
" ## LoRA에서 삽윕되는 저차원 행렬의 rank\n",
|
| 386 |
-
" ## A, B라는 작은 행렬 추가\n",
|
| 387 |
-
" ## 기존 가중치가 4096 x 4096이라면 A : 4096 X 8, B : 8 X 4096 행렬 추가하여\n",
|
| 388 |
-
" ## 새로운 파라미터를 학습시킴\n",
|
| 389 |
-
" r=8,\n",
|
| 390 |
-
" ## LoRA에서 사용되는 스케일링 계수\n",
|
| 391 |
-
" ## 모델의 파라미터에 비해 상대적으로 작은 갯수를 학습시키기 때문에 영향이 작아\n",
|
| 392 |
-
" ## 알파값을 설정해 영향력을 증폭시켜 줌\n",
|
| 393 |
-
" ## 너무 작으면 학습 효과가 없고, 크면 과잉 튜닝됨\n",
|
| 394 |
-
" lora_alpha=16,\n",
|
| 395 |
-
" ## LoRA layer에 적용할 드롭아웃 확률\n",
|
| 396 |
-
" ## 학습 중 A 또는 B에 입력된 일부 연결을 10% 확률로 끊음\n",
|
| 397 |
-
" ## 패턴을 그대로 외워버려서 일반화가 안되는 그니까 과적합을 방지\n",
|
| 398 |
-
" lora_dropout=0.1,\n",
|
| 399 |
-
" ## 기존 모델의 bias 파라미터를 그대로 둘지 설정\n",
|
| 400 |
-
" bias=\"none\"\n",
|
| 401 |
-
")\n",
|
| 402 |
-
"## 기존 모델에 LoRA 계층을 삽입하여 peft 학습이 가능하도록 바꿈\n",
|
| 403 |
-
"model = get_peft_model(model, peft_config)\n",
|
| 404 |
-
"\n",
|
| 405 |
-
"# 4. 학습 데이터의 토큰화 함수 정의\n",
|
| 406 |
-
"def tokenize(example):\n",
|
| 407 |
-
" # 학습 데이터의 템플릿(구조) 고려해 프롬프트 생성\n",
|
| 408 |
-
" ## 입력을 하나의 긴 문자열로 만드는 역할\n",
|
| 409 |
-
" prompt = f\"{example['instruction']}\\n답변: {example['response']}\"\n",
|
| 410 |
-
" # 프롬프트를 모델이 이해할 수 있도록 텍스트 id로 변환\n",
|
| 411 |
-
" ## padding=\"max_length\" 입력 길이가 짧을 경우 뒤에 0으로 채움\n",
|
| 412 |
-
" ## truncation=True 입력이 512 토큰보다 길 경우 잘라냄\n",
|
| 413 |
-
" ## max_length=512 하나의 학습 데이터의 최대 길이는 512로 제한\n",
|
| 414 |
-
" encoded = tokenizer(prompt, padding=\"max_length\", truncation=True, max_length=512)\n",
|
| 415 |
-
" # 학습의 정답을 입력과 동일하게 설정\n",
|
| 416 |
-
" ## gpt 구조에선 입력 다음 나와야할 단어를 예측하는 학습을 함\n",
|
| 417 |
-
" ## 입력과 정답이 같고, 모델은 한 토큰씩 다음 단어를 맞추는 방식으로 학습함\n",
|
| 418 |
-
" encoded[\"labels\"] = encoded[\"input_ids\"].copy()\n",
|
| 419 |
-
" return encoded"
|
| 420 |
-
]
|
| 421 |
-
},
|
| 422 |
-
{
|
| 423 |
-
"cell_type": "code",
|
| 424 |
-
"execution_count": 2,
|
| 425 |
-
"id": "4fa47208-c384-4d19-b713-216188185dff",
|
| 426 |
-
"metadata": {
|
| 427 |
-
"scrolled": true
|
| 428 |
-
},
|
| 429 |
-
"outputs": [
|
| 430 |
-
{
|
| 431 |
-
"name": "stdout",
|
| 432 |
-
"output_type": "stream",
|
| 433 |
-
"text": [
|
| 434 |
-
"{'instruction': '어문학이란 무엇인가요?', 'response': '어문학 전공에서는 동·서양 언어의 원리를 체계적으로 연구하고, 각 나라�� 문학과 문화를 이해하여 세계화 시대에 요구되는 인문학적 교양과 언어 관련 실무적 능력을 계 발한다. 어문학 전공은 언어적 감각, 논리적 사고력, 비판적 분석 능력이 필요하고, 언어 와 문학 그리고 다양한 국가의 사회·문화적 특성에 대해 관심이 있어야 한다.'}\n",
|
| 435 |
-
"{'instruction': '문화·인류·역사이란 무엇인가요?', 'response': '문화·인류·역사 전공은 인간이 출현한 시기부터 현재까지의 문화와 사회를 탐구하 고, 시대별로 문화 및 사회의 특성을 연구하여 역사적 의의를 이해하는 분야이다. 문화· 인류·역사 전공은 고도의 관찰력 및 분석력이 필요하고, 한국사 및 세계사 그리고 다양 한 사회적·역사적 현상에 대해 관심이 있어야 한다.'}\n",
|
| 436 |
-
"{'instruction': '철학이란 무엇인가요?', 'response': '철학 전공에서는 자신을 둘러싼 자연, 우주, 사회에 대한 의미를 통찰하고 이를 논리 적으로 분석하여 인간 행위와 세계에 대한 의미를 탐색한다. 철학 전공은 자연, 우주, 사 회를 논리적으로 분석하여 그것의 의미를 탐색하는 통합적 사고 능력이 필요하고, 인간 본성과 존재 가치, 삶의 본질에 대해 관심이 있어야 한다.'}\n",
|
| 437 |
-
"{'instruction': '법학이란 무엇인가요?', 'response': '법학 전공은 법과 관련된 기초적인 이론에서부터 사법, 공법, 사회법 및 국제 관계와 관련된 다양한 법학 이론들을 습득하고 이를 구체적인 사례에 적용한다. 법학 전공자는 사건과 상황을 분석하여 타당한 결론에 이를 수 있는 사고력과 공정한 판단력이 필요하 고, 법률과 관련된 사회현상 및 사회문제에 대해 관심과 흥미가 있어야 한다.'}\n",
|
| 438 |
-
"{'instruction': '정치·국제관계이란 무엇인가요?', 'response': '정치·국제관계 전공은 한 국가 내 혹은 여러 국가 간의 정치적 현상을 분석하고 비판 하며, 국내·외의 정치적 현상과 국제 관계에 대한 이론과 실제를 연구한다. 정치·국제관 계 전공자는 국제적 현상과 국가 간 관계·세력 변화 등을 파악할 수 있는 분석력과 논리 력이 필요하고, 국내·외의 다양한 정치·경제·사회적 이슈에 대한 문제의식과 관심, 흥미 가 있어야 한다.'}\n",
|
| 439 |
-
"{'instruction': '행정이란 무엇인가요?', 'response': '행정 전공은 국민과 정부 간의 상호작용, 다양한 공공부문에서의 행정 및 정책과 관 련된 현상을 분석함으로써 공공분야 관리 등 국가 운영을 효율적으로 수행할 수 있는 방 안을 모색한다. 행정 전공자는 사회 문제에 대한 합리적인 판단 능력과 사회 문제를 효 율적으로 해결할 수 있는 문제해결 능력이 필요하고, 공공의 문제와 정책 그리고 정부와 공공 기관의 성격, 업무 등에 대해 관심과 흥미가 있어야 한다.'}\n",
|
| 440 |
-
"{'instruction': '사회이란 무엇인가요?', 'response': '사회 전공은 사회의 다양한 현상과 문제를 관찰, 분석하고 이를 통해 그것의 의미를 해석함으로써 사회 구성원들 간의 상호작용 및 사회구조에 대하여 탐구하고 현대 사회 의 문제들을 해결한다. 사회 전공자는 사회 현상을 객관적으로 관찰하고 과학적으로 분 석할 수 있는 능력이 필요하고, 개인적·사회적 수준의 다양한 문제를 탐구하는 것에 관 심과 흥미가 있어야 한다.'}\n",
|
| 441 |
-
"{'instruction': '심리이란 무엇인가요?', 'response': '심리 전공은 인간의 행동과 정신 과정, 개인 간 상호관계 형성에 관한 심층적 연구를 통해 개인이 가진 심리·정서적 문제를 해결하고 조화로운 인격 형성과 인성 회복을 위 한 방안을 모색한다. 심리 전공자는 심리 현상에 대한 실험과 조사를 과학적으로 실시하 고, 세밀하게 관찰하며, 결과를 논리적으로 해석할 수 있는 능력이 필요하고, 사람들의 사고, 성격, 행동 및 그와 관련되는 사회 현상에 대한 관심과 흥미가 있어야 한다.'}\n",
|
| 442 |
-
"{'instruction': '사회복지이란 무엇인가요?', 'response': '사회복지 전공은 가족·아동·청소년·노인·여성 등 사회 구성원의 일정한 생활 수준 및 보건 상태를 확보하기 위해 사회 정책 및 제도와 관련된 이론과 방법을 탐구한다. 사 회복지 전공자는 사회 구성원의 일정한 생활 수준 및 보건 상태를 지원하기 위한 사회 정책 및 제도 등을 학문적으로 이해할 수 있는 능력이 필요하고, 주위 이웃에 대한 관심 과 봉사정신이 있어야 한다.'}\n",
|
| 443 |
-
"{'instruction': '문헌정보이란 무엇인가요?', 'response': '문헌정보 전공은 각종 지적 활동에 필요한 정보 및 문헌의 속성을 이해하고, 다양한 미디어를 통�� 정보를 효율적으로 수집, 정리, 가공, 관리, 배포하는 지식 정보 관리 능력 을 계발한다. 문헌정보 전공자는 상황에 따른 적합한 도서 및 자료의 수집·정리·가공 능 력, 도서 및 자료의 관리 및 활용을 위한 전산 처리 및 통계 처리 능력이 필요하고, 다양 한 분야의 도서와 자료에 대한 관심과 흥미가 있어야 한다.'}\n",
|
| 444 |
-
"{'instruction': '언론·홍보·미디어이란 무엇인가요?', 'response': '언론·홍보·미디어 전공은 사회의 여러 영역에서 이루어지는 대중 매체의 소통 과정 을 분석, 연구하여 다양한 미디어 콘텐츠 제작과 바람직한 미디어·대중 매체의 발전 방 안에 대해 연구한다. 언론·홍보·미디어 전공자는 최신 트렌드를 파악하는 능력, 정확한 정보 전달을 위한 커뮤니케이션 능력, 그리고 매력적 콘텐츠 생산을 위한 예술성 및 창 의력이 필요하고, 대중 매체와 다양한 콘텐츠, 뉴미디어 등에 대한 관심이 있어야 한다.'}\n",
|
| 445 |
-
"{'instruction': '도시·지역이란 무엇인가요?', 'response': '도시·지역 전공은 도시 및 지역과 관련된 각종 문제를 분석하고 이를 합리적으로 해 결할 수 있는 방안을 모색하여 국토를 경제적, 사회적, 문화적 측면에서 조화롭고 균형 있게 발전하는 방안에 대해 연구한다. 도시·지역 전공자는 도시의 기능과 역할, 교통 체 계, 지역적 특성에 적합한 사회기반시설 등에 대한 이해 능력과 창의력, 공간지각력이 필요하고, 공간에 대한 호기심이 있어야 한다.'}\n",
|
| 446 |
-
"{'instruction': '군사·국방·안보이란 무엇인가요?', 'response': '군사·국방·안보 전공은 군사 정책 및 전략에 필요한 전문 지식을 습득하고, 다양한 상황에서 실질적으로 대처 가능한 군사 운용 능력을 계발하며, 투철한 국가관을 함양하 여 국가의 안보에 기여한다. 군사·국방·안보 전공자는 군병력을 통솔하는 리더십과 올 바른 국가관, 훈련 및 실전에 대비한 강한 체력과 정신력, 통찰력 및 판단력이 필요하고, 국가의 안보 환경에 대한 이해와 관심이 있어야 한다.'}\n",
|
| 447 |
-
"{'instruction': '경찰·소방·안전이란 무엇인가요?', 'response': '경찰·소방·안전 전공은 각종 범죄 현상의 원인과 대책을 연구하거나 안전 관리에 대 한 이론적 지식 및 실무 능력을 습득함으로써 범죄, 위험 및 재난으로부터 국민의 생명 과 재산을 보호한다. 경찰·소방·안전 전공자는 현장에서의 돌발 상황을 해결할 수 있는 리더십과 조직적 사고, 책임감, 상황판단력이 필요하고, 사회 문제 및 범죄 해결, 각종 사 건·사고에 관심과 흥미가 있어야 한다.'}\n",
|
| 448 |
-
"{'instruction': '경영이란 무엇인가요?', 'response': '경영 관련 전공에서는 기업 경영에 필요한 여러 가지 이론과 기법을 연구하고, 생활 에 필요한 다양한 상품 또는 서비스를 생산, 유통, 판매하는 전 과정에 대해 연구한다. 경 영학 관련 전공자에게는 효율적인 경영 활동에 대한 분석·실행 능력과 합리적 의사결정 능력이 필요하고, 조직의 성과를 높이기 위한 경영 활동 및 글로벌 기업 환경의 변화에 대한 관심과 흥미가 있어야 한다.'}\n",
|
| 449 |
-
"{'instruction': '경제·금융·부동산이란 무엇인가요?', 'response': '경제·금융·부동산 전공은 국가, 조직, 개인 등의 경제 상황을 분석·진단하여 경제 관 련 문제에 적절히 대응할 수 있는 방법을 연구한다. 따라서 금융의 흐름을 파악하기 위 한 분석력과 수학 능력, 정보처리 및 활용능력이 필요하고, 국가 및 세계 경제의 흐름에 관심이 있어야 한다.'}\n",
|
| 450 |
-
"{'instruction': '무역·물류이란 무엇인가요?', 'response': '무역·물류 전공은 물품·서비스·기술·자원 등의 국가 간 이동과 물품의 생산에서 공 급에 이르는 일련의 과정을 경제적이고 효율적으로 관리하는 방법 및 국제 경제 교류와 관련된 사안에 대해 연구한다. 그러므로 무역·물류 전공자는 세계 소비경향 및 자원의 흐름을 분석하고 이해하는 능력과 관련 정보를 경영, 경제, 법, 보험, 외국어 등의 인접 학문과 연계할 수 있는 능력이 필요하고, 국제 경제 교류에 대해 관심이 있어야 한다.'}\n",
|
| 451 |
-
"{'instruction': '회계·세무이란 무엇인가요?', 'response': '회계·세무 전공은 기업의 회계정보를 체계적인 방법으로 산출·분석하고, 세무와 관 련된 효율적인 의사결정 방안을 탐색한다. 따라서 이해관계를 분석하고 예측할 수 있는 수리 능력 및 논리력이 필요하고, 경제 및 기업 자원의 효율적 배분에 관심이 있어야 한다.'}\n",
|
| 452 |
-
"{'instruction': '관광이란 무엇인가요?', 'response': '관광 전공에서는 관광을 통한 삶의 질 향상을 위해 국내외 관광지를 파악하고, 관광 현상에 대한 학문적 분석과 실무적인 정책을 수립한다. 그러므로 관광 상품의 개발 및 기획 능력, 외국어 능력, 인적 네트워크 형성 능력이 필요하고, 여행 및 관광에 대한 흥미 와 관심이 있어야 한다.'}\n",
|
| 453 |
-
"{'instruction': '교육이란 무엇인가요?', 'response': '교육 전공은 교육 기관 안팎의 교육활동을 총체적으로 이해하고, 교육과 관련한 다 양한 문제에 대해 해결 방법을 모색한다. 따라서 교육 현상 및 교육 정책 등에 대한 판단 력과 교육 문제의 원인을 체계적으로 파악하는 분석력이 필요하고, 인간과 교육 활동에 대한 관심이 있어야 한다.'}\n",
|
| 454 |
-
"{'instruction': '유아교육이란 무엇인가요?', 'response': '유아교육 전공에서는 영·유아기 발달에 대한 체계적인 이론을 이해하고, 이를 현장 에 적용해 보는 실습을 통해 영·유아의 신체적, 정서적 발달에 따른 교육 방법에 대해 학 습한다. 따라서 아동의 발달, 심리와 행동, 부모 교육 등 아동에 대한 전문적인 지식과 아 동의 수준에 맞는 의사소통 능력과 언어 구사 능력이 필요하고, 아동 보육에 대한 책임 감이 있어야 한다.'}\n",
|
| 455 |
-
"{'instruction': '초등교육이란 무엇인가요?', 'response': '초등교육 전공에서는 만 6∼12세 아동을 대상으로, 그들의 심리적 특성을 파악하고 국어, 수학, 미술 등 다양한 교과 이론을 적용하여 교육 현장에서 교사로서 업무를 수행 할 수 있는 방법들을 학습한다. 따라서 초등학교 교과에 대한 기초 지식과 다양한 교육 방법을 고안할 수 있는 창의력, 어린이의 발달에 대한 높은 이해 능력이 필요하고, 초등 교육에 대한 관심이 있어야 한다.'}\n",
|
| 456 |
-
"{'instruction': '중등교육이란 무엇인가요?', 'response': '중등교육 전공에서는 만 13∼18세 중·고등학교 학생들을 대상으로 그들을 가르치 기 위해 특정 교과목을 전공하고, 교육 현장에서 교사로서 업무를 수행할 수 있는 방법 들을 학습한다. 이에 중·고등학교 교과에 대한 지식, 현행 교육과정 및 교육정책에 대한 이해, 학생 지도 능력, 교육 현상을 종합적으로 이해하고 비판할 수 있는 능력이 필요하 고, 중·고등학교 교육에 대한 관심이 있어야 한다.'}\n",
|
| 457 |
-
"{'instruction': '특수교육이란 무엇인가요?', 'response': '특수교육 전공에서는 신체적, 정신적, 사회적 발달 장애를 지닌 학생들에게 적합한 교육을 제공하여 그들이 사회 구성원으로서 생활할 수 있도록 교육하는 특수교육 전문 가를 양성한다. 따라서 특수교육에 대한 전문적인 지식을 바탕으로 다양한 상황에서의 대처 능력이 필요하고, 장애학생에 대한 사랑, 교사로서의 소명 의식과 봉사 및 희생 정 신이 있어야 한다.'}\n",
|
| 458 |
-
"{'instruction': '수학이란 무엇인가요?', 'response': '수학 전공에서는 다양한 물체나 공간, 현상을 계량화하여 분석·설명하고, 수의 체계 와 성질을 연구한다. 수학 전공은 논리적인 사고와 분석력, 추리력이 필요하고, 문제 해 결 과정을 중요하게 생각하며 수의 성질에 대한 흥미가 있어야 한다.'}\n",
|
| 459 |
-
"{'instruction': '통계이란 무엇인가요?', 'response': '통계 전공에서는 연구목적에 부합하는 자료를 수집, 요약함으로써 사회 각 분야의 다양한 특성 및 정보를 분석하고 해석하는 이론과 방법을 연구한다. 통계 전공은 다양한 통계 방법론을 적용할 수 있는 응용력과 정보를 분석하고 추리할 수 있는 능력이 필요하 고, 수학에 대한 흥미가 있어야 한다.'}\n",
|
| 460 |
-
"{'instruction': '물리·천문이란 무엇인가요?', 'response': '물리·천문 전공에서는 모든 자연현상을 존재하는 힘의 원리와 우주에서 일어나는 다양한 현상을 관측하여 우주의 질서와 법칙을 탐구한다. 물리·천문 전공은 눈에 보이 지 않는 작은 세계를 포함해 지구와 우주에 대한 창의적인 사고 능력, 천체나 지구에서 일어나는 현상을 분석하는 논리적인 사고 능력이 필요하고, 다양한 자연 현상에 대한 관 심이 있어야 한다.'}\n",
|
| 461 |
-
"{'instruction': '지질·대기·해양이란 무엇인가요?', 'response': '지질·대기·해양 전공에서는 지구를 구성하는 물질의 성분, 구조, 형성 및 변화 과정 등을 연구하고 지구를 둘러싼 대기와 해양의 자연 현상에 대해 탐구한다. 지질·대기·해 양 전공은 과학 교과 전반에 대한 기본 지식 그리고 자연 환경에 대한 관찰력과 탐��력 이 필요하고, 자연, 대기, 바다에서 발생하는 자연 현상에 관심이 있어야 한다.'}\n",
|
| 462 |
-
"{'instruction': '농림·축산·수산이란 무엇인가요?', 'response': '농림·축산·수산 전공에서는 농·축·수산물을 효율적으로 관리하고 개발, 생산하기 위 한 연구를 수행하며, 농·축·수산 식품의 생산, 가공처리, 유통 등에 대한 지식을 습득하 여 관련된 문제들을 탐색하고 해결방법을 모색한다. 농림·축산·수산 전공은 생화학적 기초와 생명과학 및 화학 지식이 필요하고, 농어촌 환경과 동·식물에 대한 관심이 있어 야 한다.'}\n",
|
| 463 |
-
"{'instruction': '식품영양이란 무엇인가요?', 'response': '식품영양 전공에서는 개인, 가정, 집단의 음식 섭취와 식생활 문제를 분석하고, 건강 한 삶의 유지를 목적으로 하는 식생활의 질적 향상을 위해 건강 및 영양을 관리·증진하 는 방안에 대하여 연구한다. 식품영양 전공은 식품, 영양에 대한 중요성을 이해하고 제 품 개발이나 첨단기술 적용을 위한 창의력, 응용력이 필요하며, 다양한 식품의 성분과 영양소에 대해 흥미가 있어야 한다.'}\n",
|
| 464 |
-
"{'instruction': '기계이란 무엇인가요?', 'response': '기계 전공에서는 다양한 산업분야의 토대가 되는 각종 기계와 장비의 설계, 제작, 이 용, 관리 등에 대한 이론과 응용에 대해 연구한다. 기계 전공자에게는 수학, 물리 등 기초 과학 지식이 필요하고, 기계 작동 원리를 이해하기 위한 논리력과 지식 및 이론을 응용 할 수 있는 능력이 필요하며 기계, 자동차, 전기, 전자 등에 대한 흥미가 있어야 한다.'}\n",
|
| 465 |
-
"{'instruction': '전기·전자이란 무엇인가요?', 'response': '전기·전자 전공에서는 전기 및 자기의 흐름과 고체, 기체, 진공 내에서의 전자 운동 을 탐구하고 이것을 실생활에 응용하는 방법을 연구하는 학문이다. 전기·전자 전공자에 게는 새로운 기능을 전기·전자제품으로 구현할 수 있는 창의력, 분석적 사고가 필요하 고, 전기전자 시스템 이해를 위한 논리적 사고가 필요하며, 수학, 물리학에 대한 흥미가 있어야 한다.'}\n",
|
| 466 |
-
"{'instruction': '컴퓨터·소프트웨어이란 무엇인가요?', 'response': '컴퓨터·소프트웨어 전공에서는 컴퓨터의 하드웨어와 소프트웨어, 멀티미디어 등 컴퓨터와 관련된 기술과 지식을 습득하고 이를 바탕으로 다양한 분야에 적용하는 학문 이다. 컴퓨터·소프트웨어 전공자에게는 새로운 소프트웨어 개발에 필요한 컴퓨터 프로 그래밍 언어에 대한 지식과 논리적 사고능력 및 창의력이 필요하고, 수학에 대한 흥미와 관심이 있어야 한다.'}\n",
|
| 467 |
-
"{'instruction': '정보·통신·보안이란 무엇인가요?', 'response': '정보·통신·보안 전공에서는 컴퓨터공학기반 지식을 바탕으로 ICT(정보통신기술) 및 다양한 융합산업분야의 정보·통신·보안에 관한 이론을 습득하고 이를 적용하는 학문이 다. 정보·통신·보안 전공자에게는 수학, 통계, 물리 등에 대한 기본 지식과 전기, 전자, 컴 퓨터에 대한 기초지식, 논리적 사고력, 창의적이며 유연한 사고, 정확한 판단력이 필요 하고, 다양한 산업의 정보·통신 분야에 관심이 있어야 한다.'}\n",
|
| 468 |
-
"{'instruction': '산업공학이란 무엇인가요?', 'response': '산업공학 전공에서는 제품 생산과 전달의 전 과정에 필요한 기계, 기술, 인적자원 등 에 관한 최적의 시스템을 연구한다. 산업공학 전공자에게는 데이터에 기반하여 시스템 의 효율성을 높일 수 있는 문제해결능력과 사고력이 필요하고, 공학뿐 아니라 경영학 등 의 사회과학에 관심이 있어야 한다.'}\n",
|
| 469 |
-
"{'instruction': '건축·토목이란 무엇인가요?', 'response': '건축·토목 전공에서는 건축물 및 도로, 항구, 댐 등의 사회기반시설을 설계하고 건축 하기 위한 이론을 연구한다. 건축·토목 전공자에게는 수학, 과학 등 기초분야를 비롯하 여 컴퓨터 활용 능력, 공간 지각력 및 공간 이해력이 필요하고, 아름다운 건축 설계를 위 한 문화적·미적 감각이 있어야 한다.'}\n",
|
| 470 |
-
"{'instruction': '환경·에너지이란 무엇인가요?', 'response': '환경·에너지 전공에서는 자연을 구성하는 물, 대기, 토양과 생태계에서 일어나는 환 경 변화, 에너지의 생산 과정 및 변환 과정 등을 탐구하여 인간의 삶의 질 향상을 목적으 로 하는 학문이다. 환경·에너지 전공자에게는 실험 연구를 위한 분석적 사고와 집중력, 화학, 물리, 수학 등 기초과학 분야에 대한 이해 능력이 필요하고, 환경문제 및 자연에 대 한 넓은 이해와 관심이 있어야 한다.'}\n",
|
| 471 |
-
"{'instruction': '생명과학·생명공학이란 무엇인가요?', 'response': '생명과학·생명공학 전공에서는 생명체에 대한 지식과 이해를 바탕으로 다양한 생 명 현상의 과정을 탐구하며, 의료, 환경 등의 연구와 산업에 기초가 되는 학문이다. 생명 과학·생명공학 전공자에게는 자연과학 분야에 대한 깊이 있는 이해와 지식 그리고 관찰 력, 논리적 사고, 분석력, 통찰력이 필요하고, 다양한 생명 현상과 생명체에 관심이 있어 야 한다.'}\n",
|
| 472 |
-
"{'instruction': '화학·화학공학이란 무엇인가요?', 'response': '화학·화학공학 전공에서는 화학 반응의 원리를 실생활에 응용하는 기술과 방법을 연구하는 학문으로, 고분자, 신에너지, 환경기술 등 화학 공정이 필요한 산업에 활용되 는 학문이다. 화학·화학공학 전공자에게는 수학, 물리 등 기초과학분야에 대한 지식과 분석적인 사고 능력이 필요하고, 꼼꼼하고 주의 깊은 성격과 물질 변화에 대한 관심이 있어야 한다.'}\n",
|
| 473 |
-
"{'instruction': '재료·신소재이란 무엇인가요?', 'response': '재료·신소재 전공에서는 다양한 재료의 구조와 특징을 이해하고 산업에 필요한 신 소재, 생체재료, 기능재료 등의 첨단 재료에 대해 연구하고 개발하는 학문이다. 재료·신 소재 전공자에게는 다양한 소재에 대한 이해와 이를 실생활에 적용시킬 수 있는 응용력, 실험·실습을 위한 분석적 사고력이 필요하고, 수학, 화학, 물리 등 기초과학에 관심이 있 어야 한다.'}\n",
|
| 474 |
-
"{'instruction': '의학이란 무엇인가요?', 'response': '의학 전공은 인체에서 발생하는 질병의 예방·진단·치료와 관련된 지식을 습득하고, 이를 활용하여 환자를 진료하며, 의학 이론을 탐구함으로써 질병 예방 및 치료 방안에 대한 연구를 수행한다. 의학 전공자는 화학 및 생명과학의 기초 지식과 과학적 사고방 식, 의학적 진단과 처치를 위한 추론력이 필요하고, 환자의 고통을 이해하며 생명을 구 하는 일에 보람을 느끼고, 인체의 구조와 기능에 관심이 있어야 한다.'}\n",
|
| 475 |
-
"{'instruction': '약학이란 무엇인가요?', 'response': '약학 전공은 질병의 예방 및 치료에 사용되는 의약품에 관한 기초 이론과 의약품의 개발, 생산, 조제와 관련된 지식을 습득하고 이에 대해 연구한다. 약학 전공자는 실험 및 실습에서의 침착함, 깊은 주의력 그리고 분석적인 사고력이 필요하고, 화학, 생명과학에 관심이 있어야 한다.'}\n",
|
| 476 |
-
"{'instruction': '간호이란 무엇인가요?', 'response': '간호 전공은 인간이 건강을 유지 및 증진하고 질병으로부터 회복할 수 있도록 하는 이론과 실무 그리고 간호 대상자의 간호 문제를 진단, 중재, 평가할 수 있는 능력을 개발 하고 적용한다. 간호 전공자는 화학 및 생명과학에 대한 이해와 환자 간호를 위한 의사 소통 능력이 필요하고, 질병과 환자의 고통에 관심과 배려가 있어야 한다.'}\n",
|
| 477 |
-
"{'instruction': '보건·임상이란 무엇인가요?', 'response': '보건·임상 전공은 공중보건, 개인 위생 등 건강을 향상시키기 위한 방안을 탐색하고, 신체적·정신적 장애를 가진 사람들을 보조하는 치료 시설과 첨단 의료 장비를 다루고 만드는 기술에 대해 연구한다. 보건·임상 전공자는 기초과학에 대한 지식을 바탕으로 공중보건과 개인 위생에 대한 이해 능력, 환자 상태에 따라 적절한 치료 방법을 수행하 는 실행 능력이 필요하고, 보건의료인으로서의 사명감이 있어야 한다.'}\n",
|
| 478 |
-
"{'instruction': '무용이란 무엇인가요?', 'response': '무용 전공에서는 무용 이론과 관련된 전문 지식을 습득하고. 실기 교육을 통해 균형 있는 신체의 움직임을 연마하여 무용 작품에 대한 해석력과 예술적 표현력 등을 함양한 다. 따라서 음악과 주제에 맞춰 몸으로 표현할 수 있는 능력이 필요하고, 강한 체력과 유 연한 신체조건을 갖추기 위한 끈기와 인내심이 있어야 한다.'}\n",
|
| 479 |
-
"{'instruction': '체육이란 무엇인가요?', 'response': '체육 전공에서는 신체활동을 바탕으로 하는 운동, 건강, 스포츠 과학, 여가에 대한 이론을 배우고 이와 관련한 특정 실기 실습을 수행하여 신체적 능력을 계발한다. 체육을 전공하기 위해서는 강인한 체력 및 정신력 그리고 경기를 정당하게 치르기 위한 스포츠 맨십이 필요하고, 운동하기를 좋아하는 마음과 스포츠에 관심이 있어야 한다.'}\n",
|
| 480 |
-
"{'instruction': '연예·영화·연극이란 무엇인가요?', 'response': '연예·영화·연극 전공은 다양한 매체를 활용하여 새로운 영상 언어를 창출하고 영화, 연극 등의 분야에서 인간의 정서를 전달할 수 있는 활동을 수행한다. 따라서 배역에 대 한 분석력, 연기력, 예술적 지식이 필요하고, 생각을 매체를 통해 표현하는 능력이 필요 하며 미술, 음악, 무용, 어학, 연극, 사회학, 언론학 등 다양한 분야에 관심이 있어야 한다.'}\n",
|
| 481 |
-
"{'instruction': '음악이란 무엇인가요?', 'response': '음악 전공에서는 음악 전반에 관한 이론 학습과 다양한 음악 관련 기교의 훈련을 통 해 기존 음악을 연주하거나 새로운 음악을 창작하며, 전문적으로 감상 및 비평하는 능력 을 계발한다. 그러므로 청음능력, 창의력, 음악을 소리나 악기로 표현할 수 있는 연주 능 력이 필요하고, 음감과 음악적 감수성이 있어야 한다.'}\n",
|
| 482 |
-
"{'instruction': '미술·공예·디자인이란 무엇인가요?', 'response': '미술·공예·디자인 전공은 미술 전반에 대한 지식과 실기 교육을 통해 미술적 상상력 과 창의성 및 여러 가지 표현 방법을 습득하고, 기능적·심미적 조건을 고려하여 각종 상 품의 디자인을 개발하고 연구한다. 따라서 미술 작품을 만들기 위한 독창성과 창의성, 정교한 기법 활용 능력이 필요하고, 예술 분야에서의 변화와 유행에 민감해야 한다.'}\n",
|
| 483 |
-
"{'instruction': '디지털콘텐츠이란 무엇인가요?', 'response': '디지털콘텐츠 전공에서는 뉴미디어 매체인 디지털 게임, 디지털 영상, 애니메이션, 인터랙티브 디자인콘텐츠 등의 기획과 연출을 수행하고, 다양한 시각적 표현과 디자인 을 탐색 및 창출한다. 그러므로 디지털콘텐츠 전공자가 되기 위해서는 디지털 기술에 대 한 지식, 디지털콘텐츠 제작 능력, 트렌드를 파악하는 능력, 창의력, 기획력이 필요하고, 다양한 매체에 대한 관심이 있어야 한다.'}\n",
|
| 484 |
-
"[99, 97, 91, 100, 115, 116, 105, 123, 106, 118, 118, 118, 125, 115, 108, 90, 127, 82, 79, 82, 107, 112, 115, 103, 75, 91, 113, 102, 116, 111, 103, 109, 93, 129, 85, 93, 115, 110, 110, 111, 122, 88, 92, 119, 92, 98, 109, 94, 100, 104]\n"
|
| 485 |
-
]
|
| 486 |
-
}
|
| 487 |
-
],
|
| 488 |
-
"source": [
|
| 489 |
-
"# 정의한 학습데이터의 토크나이저가 512를 넘는 데이터는 잘리기 때문에\n",
|
| 490 |
-
"# 학습데이터가 몇 토큰으로 구성되는지 파악\n",
|
| 491 |
-
"from datasets import load_dataset\n",
|
| 492 |
-
"dataset = load_dataset(\"json\", data_files=\"dataset/kcmii_major_instruction_data_summarized.jsonl\", split=\"train\")\n",
|
| 493 |
-
"\n",
|
| 494 |
-
"def token_len(data) :\n",
|
| 495 |
-
" token_lengths = []\n",
|
| 496 |
-
" prompt = f\"{data['instruction']}\\n답변: {data['response']}\"\n",
|
| 497 |
-
" token = tokenizer(prompt, truncation=False)[\"input_ids\"]\n",
|
| 498 |
-
" token_lengths.append(len(token))\n",
|
| 499 |
-
" return token_lengths\n",
|
| 500 |
-
" \n",
|
| 501 |
-
"token_lengths = []\n",
|
| 502 |
-
"for i in range(0, len(dataset)) :\n",
|
| 503 |
-
" data = dataset[i]\n",
|
| 504 |
-
" print(data)\n",
|
| 505 |
-
" prompt = f\"{data['instruction']}\\n답변: {data['response']}\"\n",
|
| 506 |
-
" token = tokenizer(prompt, truncation=False)[\"input_ids\"]\n",
|
| 507 |
-
" token_lengths.append(len(token))\n",
|
| 508 |
-
"print(token_lengths)\n",
|
| 509 |
-
"\n",
|
| 510 |
-
"# 512 넘어가는 토큰은 없음"
|
| 511 |
-
]
|
| 512 |
-
},
|
| 513 |
-
{
|
| 514 |
-
"cell_type": "code",
|
| 515 |
-
"execution_count": 3,
|
| 516 |
-
"id": "be874ebd-da32-418c-9da5-ec68d2d8edfd",
|
| 517 |
-
"metadata": {
|
| 518 |
-
"scrolled": true
|
| 519 |
-
},
|
| 520 |
-
"outputs": [
|
| 521 |
-
{
|
| 522 |
-
"name": "stderr",
|
| 523 |
-
"output_type": "stream",
|
| 524 |
-
"text": [
|
| 525 |
-
"No label_names provided for model class `PeftModelForCausalLM`. Since `PeftModel` hides base models input arguments, if label_names is not given, label_names can't be set automatically within `Trainer`. Note that empty label_names list will be used instead.\n",
|
| 526 |
-
"/opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages/torch/utils/data/dataloader.py:683: UserWarning: 'pin_memory' argument is set as true but not supported on MPS now, then device pinned memory won't be used.\n",
|
| 527 |
-
" warnings.warn(warn_msg)\n"
|
| 528 |
-
]
|
| 529 |
-
},
|
| 530 |
-
{
|
| 531 |
-
"data": {
|
| 532 |
-
"text/html": [
|
| 533 |
-
"\n",
|
| 534 |
-
" <div>\n",
|
| 535 |
-
" \n",
|
| 536 |
-
" <progress value='250' max='250' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
|
| 537 |
-
" [250/250 15:42, Epoch 10/10]\n",
|
| 538 |
-
" </div>\n",
|
| 539 |
-
" <table border=\"1\" class=\"dataframe\">\n",
|
| 540 |
-
" <thead>\n",
|
| 541 |
-
" <tr style=\"text-align: left;\">\n",
|
| 542 |
-
" <th>Step</th>\n",
|
| 543 |
-
" <th>Training Loss</th>\n",
|
| 544 |
-
" </tr>\n",
|
| 545 |
-
" </thead>\n",
|
| 546 |
-
" <tbody>\n",
|
| 547 |
-
" <tr>\n",
|
| 548 |
-
" <td>10</td>\n",
|
| 549 |
-
" <td>9.802700</td>\n",
|
| 550 |
-
" </tr>\n",
|
| 551 |
-
" <tr>\n",
|
| 552 |
-
" <td>20</td>\n",
|
| 553 |
-
" <td>9.243700</td>\n",
|
| 554 |
-
" </tr>\n",
|
| 555 |
-
" <tr>\n",
|
| 556 |
-
" <td>30</td>\n",
|
| 557 |
-
" <td>8.776400</td>\n",
|
| 558 |
-
" </tr>\n",
|
| 559 |
-
" <tr>\n",
|
| 560 |
-
" <td>40</td>\n",
|
| 561 |
-
" <td>8.264700</td>\n",
|
| 562 |
-
" </tr>\n",
|
| 563 |
-
" <tr>\n",
|
| 564 |
-
" <td>50</td>\n",
|
| 565 |
-
" <td>7.813600</td>\n",
|
| 566 |
-
" </tr>\n",
|
| 567 |
-
" <tr>\n",
|
| 568 |
-
" <td>60</td>\n",
|
| 569 |
-
" <td>6.891800</td>\n",
|
| 570 |
-
" </tr>\n",
|
| 571 |
-
" <tr>\n",
|
| 572 |
-
" <td>70</td>\n",
|
| 573 |
-
" <td>6.322800</td>\n",
|
| 574 |
-
" </tr>\n",
|
| 575 |
-
" <tr>\n",
|
| 576 |
-
" <td>80</td>\n",
|
| 577 |
-
" <td>5.139000</td>\n",
|
| 578 |
-
" </tr>\n",
|
| 579 |
-
" <tr>\n",
|
| 580 |
-
" <td>90</td>\n",
|
| 581 |
-
" <td>3.943400</td>\n",
|
| 582 |
-
" </tr>\n",
|
| 583 |
-
" <tr>\n",
|
| 584 |
-
" <td>100</td>\n",
|
| 585 |
-
" <td>2.517000</td>\n",
|
| 586 |
-
" </tr>\n",
|
| 587 |
-
" <tr>\n",
|
| 588 |
-
" <td>110</td>\n",
|
| 589 |
-
" <td>1.442300</td>\n",
|
| 590 |
-
" </tr>\n",
|
| 591 |
-
" <tr>\n",
|
| 592 |
-
" <td>120</td>\n",
|
| 593 |
-
" <td>1.049300</td>\n",
|
| 594 |
-
" </tr>\n",
|
| 595 |
-
" <tr>\n",
|
| 596 |
-
" <td>130</td>\n",
|
| 597 |
-
" <td>0.892200</td>\n",
|
| 598 |
-
" </tr>\n",
|
| 599 |
-
" <tr>\n",
|
| 600 |
-
" <td>140</td>\n",
|
| 601 |
-
" <td>0.763800</td>\n",
|
| 602 |
-
" </tr>\n",
|
| 603 |
-
" <tr>\n",
|
| 604 |
-
" <td>150</td>\n",
|
| 605 |
-
" <td>0.728200</td>\n",
|
| 606 |
-
" </tr>\n",
|
| 607 |
-
" <tr>\n",
|
| 608 |
-
" <td>160</td>\n",
|
| 609 |
-
" <td>0.697900</td>\n",
|
| 610 |
-
" </tr>\n",
|
| 611 |
-
" <tr>\n",
|
| 612 |
-
" <td>170</td>\n",
|
| 613 |
-
" <td>0.658500</td>\n",
|
| 614 |
-
" </tr>\n",
|
| 615 |
-
" <tr>\n",
|
| 616 |
-
" <td>180</td>\n",
|
| 617 |
-
" <td>0.633600</td>\n",
|
| 618 |
-
" </tr>\n",
|
| 619 |
-
" <tr>\n",
|
| 620 |
-
" <td>190</td>\n",
|
| 621 |
-
" <td>0.616100</td>\n",
|
| 622 |
-
" </tr>\n",
|
| 623 |
-
" <tr>\n",
|
| 624 |
-
" <td>200</td>\n",
|
| 625 |
-
" <td>0.639900</td>\n",
|
| 626 |
-
" </tr>\n",
|
| 627 |
-
" <tr>\n",
|
| 628 |
-
" <td>210</td>\n",
|
| 629 |
-
" <td>0.610700</td>\n",
|
| 630 |
-
" </tr>\n",
|
| 631 |
-
" <tr>\n",
|
| 632 |
-
" <td>220</td>\n",
|
| 633 |
-
" <td>0.607500</td>\n",
|
| 634 |
-
" </tr>\n",
|
| 635 |
-
" <tr>\n",
|
| 636 |
-
" <td>230</td>\n",
|
| 637 |
-
" <td>0.618500</td>\n",
|
| 638 |
-
" </tr>\n",
|
| 639 |
-
" <tr>\n",
|
| 640 |
-
" <td>240</td>\n",
|
| 641 |
-
" <td>0.592900</td>\n",
|
| 642 |
-
" </tr>\n",
|
| 643 |
-
" <tr>\n",
|
| 644 |
-
" <td>250</td>\n",
|
| 645 |
-
" <td>0.587400</td>\n",
|
| 646 |
-
" </tr>\n",
|
| 647 |
-
" </tbody>\n",
|
| 648 |
-
"</table><p>"
|
| 649 |
-
],
|
| 650 |
-
"text/plain": [
|
| 651 |
-
"<IPython.core.display.HTML object>"
|
| 652 |
-
]
|
| 653 |
-
},
|
| 654 |
-
"metadata": {},
|
| 655 |
-
"output_type": "display_data"
|
| 656 |
-
},
|
| 657 |
-
{
|
| 658 |
-
"name": "stderr",
|
| 659 |
-
"output_type": "stream",
|
| 660 |
-
"text": [
|
| 661 |
-
"/opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages/torch/utils/data/dataloader.py:683: UserWarning: 'pin_memory' argument is set as true but not supported on MPS now, then device pinned memory won't be used.\n",
|
| 662 |
-
" warnings.warn(warn_msg)\n",
|
| 663 |
-
"/opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages/torch/utils/data/dataloader.py:683: UserWarning: 'pin_memory' argument is set as true but not supported on MPS now, then device pinned memory won't be used.\n",
|
| 664 |
-
" warnings.warn(warn_msg)\n",
|
| 665 |
-
"/opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages/torch/utils/data/dataloader.py:683: UserWarning: 'pin_memory' argument is set as true but not supported on MPS now, then device pinned memory won't be used.\n",
|
| 666 |
-
" warnings.warn(warn_msg)\n",
|
| 667 |
-
"/opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages/torch/utils/data/dataloader.py:683: UserWarning: 'pin_memory' argument is set as true but not supported on MPS now, then device pinned memory won't be used.\n",
|
| 668 |
-
" warnings.warn(warn_msg)\n",
|
| 669 |
-
"/opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages/torch/utils/data/dataloader.py:683: UserWarning: 'pin_memory' argument is set as true but not supported on MPS now, then device pinned memory won't be used.\n",
|
| 670 |
-
" warnings.warn(warn_msg)\n",
|
| 671 |
-
"/opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages/torch/utils/data/dataloader.py:683: UserWarning: 'pin_memory' argument is set as true but not supported on MPS now, then device pinned memory won't be used.\n",
|
| 672 |
-
" warnings.warn(warn_msg)\n",
|
| 673 |
-
"/opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages/torch/utils/data/dataloader.py:683: UserWarning: 'pin_memory' argument is set as true but not supported on MPS now, then device pinned memory won't be used.\n",
|
| 674 |
-
" warnings.warn(warn_msg)\n",
|
| 675 |
-
"/opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages/torch/utils/data/dataloader.py:683: UserWarning: 'pin_memory' argument is set as true but not supported on MPS now, then device pinned memory won't be used.\n",
|
| 676 |
-
" warnings.warn(warn_msg)\n",
|
| 677 |
-
"/opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages/torch/utils/data/dataloader.py:683: UserWarning: 'pin_memory' argument is set as true but not supported on MPS now, then device pinned memory won't be used.\n",
|
| 678 |
-
" warnings.warn(warn_msg)\n"
|
| 679 |
-
]
|
| 680 |
-
},
|
| 681 |
-
{
|
| 682 |
-
"data": {
|
| 683 |
-
"text/plain": [
|
| 684 |
-
"('./kcmii_major_lora_tuned/tokenizer_config.json',\n",
|
| 685 |
-
" './kcmii_major_lora_tuned/special_tokens_map.json',\n",
|
| 686 |
-
" './kcmii_major_lora_tuned/tokenizer.json')"
|
| 687 |
-
]
|
| 688 |
-
},
|
| 689 |
-
"execution_count": 3,
|
| 690 |
-
"metadata": {},
|
| 691 |
-
"output_type": "execute_result"
|
| 692 |
-
}
|
| 693 |
-
],
|
| 694 |
-
"source": [
|
| 695 |
-
"tokenized_dataset = dataset.map(tokenize)\n",
|
| 696 |
-
"\n",
|
| 697 |
-
"# 5. 학습을 수행할 때 사용할 파라미터 지정\n",
|
| 698 |
-
"training_args = TrainingArguments(\n",
|
| 699 |
-
" # 학습 도중 모델 체크포인트 저장할 폴더 경로\n",
|
| 700 |
-
" ## 중각 결과 백업, 실험별 구분 가능\n",
|
| 701 |
-
" output_dir=\"./kcmii_major_lora\",\n",
|
| 702 |
-
" # 한번에 학습할 샘플 개수\n",
|
| 703 |
-
" per_device_train_batch_size=2,\n",
|
| 704 |
-
" # 전체 데이터를 몇 번 반복 학습할지\n",
|
| 705 |
-
" num_train_epochs=10,\n",
|
| 706 |
-
" # 몇 스텝마다 학습 로그 출력할지\n",
|
| 707 |
-
" logging_steps=10,\n",
|
| 708 |
-
" # 모델 저장 주기 설정 (매 에폭마다 저장)\n",
|
| 709 |
-
" save_strategy=\"epoch\",\n",
|
| 710 |
-
" # 최적화 방법 설정\n",
|
| 711 |
-
" optim=\"adamw_torch\"\n",
|
| 712 |
-
")\n",
|
| 713 |
-
"\n",
|
| 714 |
-
"# 6. Trainer 구성 및 학습 실행\n",
|
| 715 |
-
"## 모델, 데이터셋, 학습 인자들을 바탕으로 내부적으로 for 반복, 최적화, 손실 계산 등을 자동 처리\n",
|
| 716 |
-
"trainer = Trainer(\n",
|
| 717 |
-
" model=model,\n",
|
| 718 |
-
" args=training_args,\n",
|
| 719 |
-
" train_dataset=tokenized_dataset\n",
|
| 720 |
-
")\n",
|
| 721 |
-
"\n",
|
| 722 |
-
"trainer.train()\n",
|
| 723 |
-
"\n",
|
| 724 |
-
"# 7. 튜닝된 모델 저장\n",
|
| 725 |
-
"model.save_pretrained(\"./kcmii_major_lora_tuned\")\n",
|
| 726 |
-
"tokenizer.save_pretrained(\"./kcmii_major_lora_tuned\")"
|
| 727 |
-
]
|
| 728 |
-
},
|
| 729 |
-
{
|
| 730 |
-
"cell_type": "code",
|
| 731 |
-
"execution_count": 16,
|
| 732 |
-
"id": "7e217351-2861-4bb7-b04b-657e91abe461",
|
| 733 |
-
"metadata": {},
|
| 734 |
-
"outputs": [
|
| 735 |
-
{
|
| 736 |
-
"name": "stderr",
|
| 737 |
-
"output_type": "stream",
|
| 738 |
-
"text": [
|
| 739 |
-
"Loading checkpoint shards: 100%|██████████| 3/3 [00:11<00:00, 3.93s/it]\n",
|
| 740 |
-
"Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n"
|
| 741 |
-
]
|
| 742 |
-
},
|
| 743 |
-
{
|
| 744 |
-
"name": "stdout",
|
| 745 |
-
"output_type": "stream",
|
| 746 |
-
"text": [
|
| 747 |
-
"\n",
|
| 748 |
-
"📄 생성된 문장:\n",
|
| 749 |
-
"\n",
|
| 750 |
-
"어문학이란 무엇인가요?\n",
|
| 751 |
-
"답변: 어문학은 문학을 중심으로 학문의 한 영역\n"
|
| 752 |
-
]
|
| 753 |
-
}
|
| 754 |
-
],
|
| 755 |
-
"source": [
|
| 756 |
-
"# 1차 추론 테스트\n",
|
| 757 |
-
"from peft import PeftModel\n",
|
| 758 |
-
"from transformers import AutoTokenizer, AutoModelForCausalLM\n",
|
| 759 |
-
"import torch\n",
|
| 760 |
-
"\n",
|
| 761 |
-
"device = torch.device(\"mps\" if torch.backends.mps.is_available() else \"cpu\")\n",
|
| 762 |
-
"\n",
|
| 763 |
-
"base_model = AutoModelForCausalLM.from_pretrained(\"EleutherAI/polyglot-ko-1.3b\", device_map=None).to(device)\n",
|
| 764 |
-
"model = PeftModel.from_pretrained(base_model, \"./kcmii_major_lora_tuned\").to(device)\n",
|
| 765 |
-
"\n",
|
| 766 |
-
"tokenizer = AutoTokenizer.from_pretrained(\"EleutherAI/polyglot-ko-1.3b\")\n",
|
| 767 |
-
"\n",
|
| 768 |
-
"prompt = \"어문학이란 무엇인가요?\\n답변: 어문학은\"\n",
|
| 769 |
-
"inputs = tokenizer(prompt, return_tensors=\"pt\").to(device)\n",
|
| 770 |
-
"\n",
|
| 771 |
-
"if \"token_type_ids\" in inputs:\n",
|
| 772 |
-
" inputs.pop(\"token_type_ids\")\n",
|
| 773 |
-
"\n",
|
| 774 |
-
"with torch.no_grad():\n",
|
| 775 |
-
" outputs = model.generate(\n",
|
| 776 |
-
" **inputs,\n",
|
| 777 |
-
" max_new_tokens=300,\n",
|
| 778 |
-
" do_sample=True,\n",
|
| 779 |
-
" top_k=50,\n",
|
| 780 |
-
" top_p=0.95,\n",
|
| 781 |
-
" temperature=0.8,\n",
|
| 782 |
-
" repetition_penalty=1.1\n",
|
| 783 |
-
" )\n",
|
| 784 |
-
"\n",
|
| 785 |
-
"result = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
|
| 786 |
-
"print(\"\\n📄 생성된 문장:\\n\")\n",
|
| 787 |
-
"print(result)"
|
| 788 |
-
]
|
| 789 |
-
},
|
| 790 |
-
{
|
| 791 |
-
"cell_type": "code",
|
| 792 |
-
"execution_count": 11,
|
| 793 |
-
"id": "6741bf0d-33cc-40fd-8936-15e29536424d",
|
| 794 |
-
"metadata": {},
|
| 795 |
-
"outputs": [
|
| 796 |
-
{
|
| 797 |
-
"name": "stdout",
|
| 798 |
-
"output_type": "stream",
|
| 799 |
-
"text": [
|
| 800 |
-
"로라 파라미터 수: 1572864\n"
|
| 801 |
-
]
|
| 802 |
-
}
|
| 803 |
-
],
|
| 804 |
-
"source": [
|
| 805 |
-
"print(\"로라 파라미터 수:\", sum(p.numel() for n, p in model.named_parameters() if \"lora\" in n))"
|
| 806 |
-
]
|
| 807 |
-
},
|
| 808 |
-
{
|
| 809 |
-
"cell_type": "code",
|
| 810 |
-
"execution_count": 12,
|
| 811 |
-
"id": "0c224268-1848-49a1-98c3-425c189063bd",
|
| 812 |
-
"metadata": {},
|
| 813 |
-
"outputs": [
|
| 814 |
-
{
|
| 815 |
-
"name": "stdout",
|
| 816 |
-
"output_type": "stream",
|
| 817 |
-
"text": [
|
| 818 |
-
"🔢 출력 토큰 수: 69\n",
|
| 819 |
-
"🧩 토큰 ID 시퀀스: [348, 3446, 5517, 1937, 11260, 34, 202, 1477, 1078, 29, 1437, 3446, 296, 414, 15, 3260, 15, 26667, 15, 16499, 15, 29953, 433, 285, 3636, 285, 18765, 301, 502, 284, 453, 414, 15, 3260, 15, 26667, 15, 16499, 15, 29953, 433, 3636, 285, 2831, 274, 1026, 26667, 15, 7991, 15, 7991, 14735, 15, 7991, 5694, 433, 339, 7093, 3668, 17, 1437, 3446, 296, 3636, 285, 394, 18765, 2048, 2]\n",
|
| 820 |
-
"📝 디코딩 전체: 어문학이란 무엇인가요?\n",
|
| 821 |
-
"답변: 현대문학은 시, 소설, 희곡, 수필, 평론 등의 문학의 갈래를 말하며 시, 소설, 희곡, 수필, 평론 등 문학의 형태에 따라 희곡, 시나리오, 시나리오창작, 시나리오작가 등으로 나뉩니다. 현대문학은 문학의 한 갈래로서<|endoftext|>\n"
|
| 822 |
-
]
|
| 823 |
-
}
|
| 824 |
-
],
|
| 825 |
-
"source": [
|
| 826 |
-
"print(\"🔢 출력 토큰 수:\", len(outputs[0]))\n",
|
| 827 |
-
"print(\"🧩 토큰 ID 시퀀스:\", outputs[0].tolist())\n",
|
| 828 |
-
"print(\"📝 디코딩 전체:\", tokenizer.decode(outputs[0], skip_special_tokens=False))"
|
| 829 |
-
]
|
| 830 |
-
},
|
| 831 |
-
{
|
| 832 |
-
"cell_type": "code",
|
| 833 |
-
"execution_count": 8,
|
| 834 |
-
"id": "83bdead2-8efe-4764-9b9e-d3d29c884ac6",
|
| 835 |
-
"metadata": {},
|
| 836 |
-
"outputs": [
|
| 837 |
-
{
|
| 838 |
-
"name": "stderr",
|
| 839 |
-
"output_type": "stream",
|
| 840 |
-
"text": [
|
| 841 |
-
"/opt/anaconda3/envs/report_error_detector/lib/python3.10/site-packages/transformers/generation/configuration_utils.py:631: UserWarning: `do_sample` is set to `False`. However, `temperature` is set to `0.7` -- this flag is only used in sample-based generation modes. You should set `do_sample=True` or unset `temperature`.\n",
|
| 842 |
-
" warnings.warn(\n",
|
| 843 |
-
"Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n",
|
| 844 |
-
"Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n",
|
| 845 |
-
"Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n"
|
| 846 |
-
]
|
| 847 |
-
},
|
| 848 |
-
{
|
| 849 |
-
"name": "stdout",
|
| 850 |
-
"output_type": "stream",
|
| 851 |
-
"text": [
|
| 852 |
-
"\n",
|
| 853 |
-
"📌 프롬프트: 어문학이란 무엇인가요?\n",
|
| 854 |
-
"답변:\n",
|
| 855 |
-
"📄 생성된 문장:\n",
|
| 856 |
-
"어문학이란 무엇인가요?\n",
|
| 857 |
-
"답변: 문학은 인간의 사상과 감정을 표현하는 예술적\n",
|
| 858 |
-
"\n",
|
| 859 |
-
"📌 프롬프트: 어문학이란 무엇인가요?\n",
|
| 860 |
-
"\n",
|
| 861 |
-
"답변:\n",
|
| 862 |
-
"📄 생성된 문장:\n",
|
| 863 |
-
"어문학이란 무엇인가요?\n",
|
| 864 |
-
"\n",
|
| 865 |
-
"답변:\n"
|
| 866 |
-
]
|
| 867 |
-
},
|
| 868 |
-
{
|
| 869 |
-
"name": "stderr",
|
| 870 |
-
"output_type": "stream",
|
| 871 |
-
"text": [
|
| 872 |
-
"Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n"
|
| 873 |
-
]
|
| 874 |
-
},
|
| 875 |
-
{
|
| 876 |
-
"name": "stdout",
|
| 877 |
-
"output_type": "stream",
|
| 878 |
-
"text": [
|
| 879 |
-
"\n",
|
| 880 |
-
"📌 프롬프트: 어문학이란 무엇인가요?\n",
|
| 881 |
-
"답변:\n",
|
| 882 |
-
"\n",
|
| 883 |
-
"📄 생성된 문장:\n",
|
| 884 |
-
"어문학이란 무엇인가요?\n",
|
| 885 |
-
"답변:\n",
|
| 886 |
-
"문학은 문학의 한 분야로, 언어를 매체로 하여 인간과 세계에 대한 표현을 탐구하는\n",
|
| 887 |
-
"\n",
|
| 888 |
-
"📌 프롬프트: Instruction: 어문학이란 무엇인가요?\n",
|
| 889 |
-
"Response:\n",
|
| 890 |
-
"📄 생성된 문장:\n",
|
| 891 |
-
"Instruction: 어문학이란 무엇인가요?\n",
|
| 892 |
-
"Response:\n"
|
| 893 |
-
]
|
| 894 |
-
}
|
| 895 |
-
],
|
| 896 |
-
"source": [
|
| 897 |
-
"for test_prompt in [\n",
|
| 898 |
-
" \"어문학이란 무엇인가요?\\n답변:\",\n",
|
| 899 |
-
" \"어문학이란 무엇인가요?\\n\\n답변:\",\n",
|
| 900 |
-
" \"어문학이란 무엇인가요?\\n답변:\\n\",\n",
|
| 901 |
-
" \"Instruction: 어문학이란 무엇인가요?\\nResponse:\"\n",
|
| 902 |
-
"]:\n",
|
| 903 |
-
" inputs = tokenizer(test_prompt, return_tensors=\"pt\").to(device)\n",
|
| 904 |
-
" if \"token_type_ids\" in inputs:\n",
|
| 905 |
-
" inputs.pop(\"token_type_ids\")\n",
|
| 906 |
-
" with torch.no_grad():\n",
|
| 907 |
-
" outputs = model.generate(\n",
|
| 908 |
-
" **inputs,\n",
|
| 909 |
-
" max_new_tokens=100,\n",
|
| 910 |
-
" do_sample=False,\n",
|
| 911 |
-
" temperature=0.7,\n",
|
| 912 |
-
" top_k=0,\n",
|
| 913 |
-
" top_p=1.0,\n",
|
| 914 |
-
" repetition_penalty=1.2,\n",
|
| 915 |
-
" eos_token_id=tokenizer.eos_token_id\n",
|
| 916 |
-
" )\n",
|
| 917 |
-
" result = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
|
| 918 |
-
" print(f\"\\n📌 프롬프트: {test_prompt}\\n📄 생성된 문장:\\n{result}\")"
|
| 919 |
-
]
|
| 920 |
-
},
|
| 921 |
-
{
|
| 922 |
-
"cell_type": "code",
|
| 923 |
-
"execution_count": 12,
|
| 924 |
-
"id": "2176d8d5-bdfb-43b3-bcbe-6cc8548514f3",
|
| 925 |
-
"metadata": {},
|
| 926 |
-
"outputs": [
|
| 927 |
-
{
|
| 928 |
-
"name": "stderr",
|
| 929 |
-
"output_type": "stream",
|
| 930 |
-
"text": [
|
| 931 |
-
"Loading checkpoint shards: 100%|██████████| 3/3 [00:09<00:00, 3.24s/it]\n"
|
| 932 |
-
]
|
| 933 |
-
},
|
| 934 |
-
{
|
| 935 |
-
"name": "stdout",
|
| 936 |
-
"output_type": "stream",
|
| 937 |
-
"text": [
|
| 938 |
-
"📊 상위 10개 예측 결과:\n",
|
| 939 |
-
"1. ' 문학' - 확률: 10.66%\n",
|
| 940 |
-
"2. '<|endoftext|>' - 확률: 10.05%\n",
|
| 941 |
-
"3. ' 인간' - 확률: 5.13%\n",
|
| 942 |
-
"4. ' 언어' - 확률: 3.81%\n",
|
| 943 |
-
"5. ' 무엇' - 확률: 2.44%\n",
|
| 944 |
-
"6. ' 크' - 확률: 2.14%\n",
|
| 945 |
-
"7. ' 음악' - 확률: 1.92%\n",
|
| 946 |
-
"8. ' 인문학' - 확률: 1.84%\n",
|
| 947 |
-
"9. ' 사회' - 확률: 1.61%\n",
|
| 948 |
-
"10. ' 문화' - 확률: 1.45%\n"
|
| 949 |
-
]
|
| 950 |
-
}
|
| 951 |
-
],
|
| 952 |
-
"source": [
|
| 953 |
-
"# 학습��� 모델의 입력에 다음 단어가 올 예측 확률 분포\n",
|
| 954 |
-
"import torch\n",
|
| 955 |
-
"from transformers import AutoModelForCausalLM, AutoTokenizer\n",
|
| 956 |
-
"from peft import PeftModel\n",
|
| 957 |
-
"\n",
|
| 958 |
-
"# 모델 불러오기\n",
|
| 959 |
-
"model_name = \"EleutherAI/polyglot-ko-1.3b\"\n",
|
| 960 |
-
"base_model = AutoModelForCausalLM.from_pretrained(model_name).to(\"mps\")\n",
|
| 961 |
-
"model = PeftModel.from_pretrained(base_model, \"./kcmii_major_lora_tuned\").to(\"mps\")\n",
|
| 962 |
-
"tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
|
| 963 |
-
"\n",
|
| 964 |
-
"# 프롬프트\n",
|
| 965 |
-
"prompt = \"어문학이란 무엇인가요?\\n답변: 어문학은\"\n",
|
| 966 |
-
"inputs = tokenizer(prompt, return_tensors=\"pt\").to(\"mps\")\n",
|
| 967 |
-
"\n",
|
| 968 |
-
"# token_type_ids 제거\n",
|
| 969 |
-
"if \"token_type_ids\" in inputs:\n",
|
| 970 |
-
" inputs.pop(\"token_type_ids\")\n",
|
| 971 |
-
"\n",
|
| 972 |
-
"# 모델 추론\n",
|
| 973 |
-
"with torch.no_grad():\n",
|
| 974 |
-
" outputs = model(**inputs)\n",
|
| 975 |
-
"\n",
|
| 976 |
-
"# 마지막 토큰 다음에 생성될 단어의 logit (예측 분포)\n",
|
| 977 |
-
"next_token_logits = outputs.logits[0, -1]\n",
|
| 978 |
-
"\n",
|
| 979 |
-
"# softmax로 확률화\n",
|
| 980 |
-
"probs = torch.nn.functional.softmax(next_token_logits, dim=-1)\n",
|
| 981 |
-
"\n",
|
| 982 |
-
"# 상위 10개 단어 출력\n",
|
| 983 |
-
"topk = torch.topk(probs, k=10)\n",
|
| 984 |
-
"top_indices = topk.indices\n",
|
| 985 |
-
"top_probs = topk.values\n",
|
| 986 |
-
"\n",
|
| 987 |
-
"print(\"📊 상위 10개 예측 결과:\")\n",
|
| 988 |
-
"for i in range(10):\n",
|
| 989 |
-
" token = top_indices[i].item()\n",
|
| 990 |
-
" print(f\"{i+1}. '{tokenizer.decode([token])}' - 확률: {top_probs[i].item()*100:.2f}%\")"
|
| 991 |
-
]
|
| 992 |
-
},
|
| 993 |
-
{
|
| 994 |
-
"cell_type": "code",
|
| 995 |
-
"execution_count": 15,
|
| 996 |
-
"id": "652acde5-5591-46a1-992e-ffd93f972dde",
|
| 997 |
-
"metadata": {},
|
| 998 |
-
"outputs": [
|
| 999 |
-
{
|
| 1000 |
-
"name": "stderr",
|
| 1001 |
-
"output_type": "stream",
|
| 1002 |
-
"text": [
|
| 1003 |
-
"Loading checkpoint shards: 100%|██████████| 3/3 [00:11<00:00, 3.84s/it]\n"
|
| 1004 |
-
]
|
| 1005 |
-
},
|
| 1006 |
-
{
|
| 1007 |
-
"name": "stdout",
|
| 1008 |
-
"output_type": "stream",
|
| 1009 |
-
"text": [
|
| 1010 |
-
"📊 상위 10개 예측 결과:\n",
|
| 1011 |
-
"1. ' 문학' - 확률: 13.43%\n",
|
| 1012 |
-
"2. ' 언어' - 확률: 11.99%\n",
|
| 1013 |
-
"3. ' 인간' - 확률: 5.63%\n",
|
| 1014 |
-
"4. ' 문자' - 확률: 5.20%\n",
|
| 1015 |
-
"5. ' 우리' - 확률: 3.36%\n",
|
| 1016 |
-
"6. ' 말' - 확률: 2.78%\n",
|
| 1017 |
-
"7. ' 크' - 확률: 2.14%\n",
|
| 1018 |
-
"8. ' 인문학' - 확률: 1.80%\n",
|
| 1019 |
-
"9. ' 사람' - 확률: 1.55%\n",
|
| 1020 |
-
"10. ' 영어' - 확률: 1.50%\n"
|
| 1021 |
-
]
|
| 1022 |
-
}
|
| 1023 |
-
],
|
| 1024 |
-
"source": [
|
| 1025 |
-
"# 베이스 모델의 입력에 다음 단어가 올 예측 확률 분포\n",
|
| 1026 |
-
"import torch\n",
|
| 1027 |
-
"from transformers import AutoModelForCausalLM, AutoTokenizer\n",
|
| 1028 |
-
"from peft import PeftModel\n",
|
| 1029 |
-
"\n",
|
| 1030 |
-
"# 모델 불러오기\n",
|
| 1031 |
-
"model_name = \"EleutherAI/polyglot-ko-1.3b\"\n",
|
| 1032 |
-
"model = AutoModelForCausalLM.from_pretrained(model_name).to(\"mps\")\n",
|
| 1033 |
-
"tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
|
| 1034 |
-
"\n",
|
| 1035 |
-
"# 프롬프트\n",
|
| 1036 |
-
"prompt = \"어문학이란 무엇인가요?\\n답변: 어문학은\"\n",
|
| 1037 |
-
"inputs = tokenizer(prompt, return_tensors=\"pt\").to(\"mps\")\n",
|
| 1038 |
-
"\n",
|
| 1039 |
-
"# token_type_ids 제거\n",
|
| 1040 |
-
"if \"token_type_ids\" in inputs:\n",
|
| 1041 |
-
" inputs.pop(\"token_type_ids\")\n",
|
| 1042 |
-
"\n",
|
| 1043 |
-
"# 모델 추론\n",
|
| 1044 |
-
"with torch.no_grad():\n",
|
| 1045 |
-
" outputs = model(**inputs)\n",
|
| 1046 |
-
"\n",
|
| 1047 |
-
"# 마지막 토큰 다음에 생성될 단어의 logit (예측 분포)\n",
|
| 1048 |
-
"next_token_logits = outputs.logits[0, -1]\n",
|
| 1049 |
-
"\n",
|
| 1050 |
-
"# softmax로 확률화\n",
|
| 1051 |
-
"probs = torch.nn.functional.softmax(next_token_logits, dim=-1)\n",
|
| 1052 |
-
"\n",
|
| 1053 |
-
"# 상위 10개 단어 출력\n",
|
| 1054 |
-
"topk = torch.topk(probs, k=10)\n",
|
| 1055 |
-
"top_indices = topk.indices\n",
|
| 1056 |
-
"top_probs = topk.values\n",
|
| 1057 |
-
"\n",
|
| 1058 |
-
"print(\"📊 상위 10개 예측 결과:\")\n",
|
| 1059 |
-
"for i in range(10):\n",
|
| 1060 |
-
" token = top_indices[i].item()\n",
|
| 1061 |
-
" print(f\"{i+1}. '{tokenizer.decode([token])}' - 확률: {top_probs[i].item()*100:.2f}%\")"
|
| 1062 |
-
]
|
| 1063 |
-
},
|
| 1064 |
-
{
|
| 1065 |
-
"cell_type": "markdown",
|
| 1066 |
-
"id": "a8af7579-789f-4d22-9bea-c136532ed8de",
|
| 1067 |
-
"metadata": {},
|
| 1068 |
-
"source": [
|
| 1069 |
-
"## 베이스 모델 임포트와 추론 테스트 완료 \n",
|
| 1070 |
-
"## 그러나 LoRA 경량 학습으로 추론 성능이 좋지 않아 Full-fine-tunning으로 진행\n",
|
| 1071 |
-
"## kcmii_lm_fullfinetuning 스크립트 참고"
|
| 1072 |
-
]
|
| 1073 |
-
},
|
| 1074 |
-
{
|
| 1075 |
-
"cell_type": "code",
|
| 1076 |
-
"execution_count": null,
|
| 1077 |
-
"id": "b62c92f5-4a8e-4c42-904e-18ca513cae1d",
|
| 1078 |
-
"metadata": {},
|
| 1079 |
-
"outputs": [],
|
| 1080 |
-
"source": []
|
| 1081 |
-
}
|
| 1082 |
-
],
|
| 1083 |
-
"metadata": {
|
| 1084 |
-
"kernelspec": {
|
| 1085 |
-
"display_name": "Python [conda env:base] *",
|
| 1086 |
-
"language": "python",
|
| 1087 |
-
"name": "conda-base-py"
|
| 1088 |
-
},
|
| 1089 |
-
"language_info": {
|
| 1090 |
-
"codemirror_mode": {
|
| 1091 |
-
"name": "ipython",
|
| 1092 |
-
"version": 3
|
| 1093 |
-
},
|
| 1094 |
-
"file_extension": ".py",
|
| 1095 |
-
"mimetype": "text/x-python",
|
| 1096 |
-
"name": "python",
|
| 1097 |
-
"nbconvert_exporter": "python",
|
| 1098 |
-
"pygments_lexer": "ipython3",
|
| 1099 |
-
"version": "3.12.7"
|
| 1100 |
-
}
|
| 1101 |
-
},
|
| 1102 |
-
"nbformat": 4,
|
| 1103 |
-
"nbformat_minor": 5
|
| 1104 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|