{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "9cf22489-4421-49b1-b5f8-f61093ce2fe6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2.1.0+cu121'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import torch\n", "torch.__version__" ] }, { "cell_type": "code", "execution_count": 2, "id": "c70f64f5-1d44-4139-adf8-f1b0b149831f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "nvcc: NVIDIA (R) Cuda compiler driver\n", "Copyright (c) 2005-2023 NVIDIA Corporation\n", "Built on Mon_Apr__3_17:16:06_PDT_2023\n", "Cuda compilation tools, release 12.1, V12.1.105\n", "Build cuda_12.1.r12.1/compiler.32688072_0\n" ] } ], "source": [ "!nvcc --version" ] }, { "cell_type": "code", "execution_count": 3, "id": "f3c2cb90-7d57-4bcb-84f3-ce30f8bbd200", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'0.0.22.post7'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import xformers\n", "xformers.__version__" ] }, { "cell_type": "code", "execution_count": 4, "id": "6a217b07-a6f5-43dc-a32f-38b3f055707b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n", "++++++++++++++++++ BUG REPORT INFORMATION ++++++++++++++++++\n", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n", "++++++++++++++++++++++++++ OTHER +++++++++++++++++++++++++++\n", "CUDA specs: CUDASpecs(highest_compute_capability=(8, 9), cuda_version_string='121', cuda_version_tuple=(12, 1))\n", "PyTorch settings found: CUDA_VERSION=121, Highest Compute Capability: (8, 9).\n", "To manually override the PyTorch CUDA version please see: https://github.com/TimDettmers/bitsandbytes/blob/main/docs/source/nonpytorchcuda.mdx\n", "The directory listed in your path is found to be non-existent: /usr/local/nvidia/lib\n", "The directory listed in your path is found to be non-existent: /usr/local/nvidia/lib64\n", "The directory listed in your path is found to be non-existent: /workspace/Untitled.ipynb\n", "The directory listed in your path is found to be non-existent: //matplotlib_inline.backend_inline\n", "CUDA SETUP: WARNING! CUDA runtime files not found in any environmental path.\n", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n", "++++++++++++++++++++++ DEBUG INFO END ++++++++++++++++++++++\n", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n", "Checking that the library is importable and CUDA is callable...\n", "SUCCESS!\n", "Installation was successful!\n" ] } ], "source": [ "!python -m bitsandbytes" ] }, { "cell_type": "code", "execution_count": 5, "id": "4ea1d820-a1e1-401d-b2ee-76bda33e7de9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a14499d3ba274ea0be10db40f11b830e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "config.json: 0%| | 0.00/662 [00:00.\n" ] } ], "source": [ "from unsloth import FastLanguageModel\n", "from transformers import AutoTokenizer\n", "\n", "max_seq_length = 2048\n", "load_in_4bit = True\n", "dtype = None\n", "\n", "revision = \"63ea4c7c4f4cae078655294c96973d0db75cd656\"\n", "pretrained_model_hf = \"Finnish-NLP/Ahma-3B\"\n", "\n", "model, _ = FastLanguageModel.from_pretrained(\n", " model_name = pretrained_model_hf,\n", " max_seq_length = max_seq_length,\n", " dtype = torch.bfloat16,\n", " load_in_4bit = load_in_4bit,\n", " revision = revision\n", ")" ] }, { "cell_type": "code", "execution_count": 6, "id": "00baa980-c4ad-45c5-86aa-93664653b6fd", "metadata": {}, "outputs": [], "source": [ "tokenizer = AutoTokenizer.from_pretrained(pretrained_model_hf, revision=revision)" ] }, { "cell_type": "code", "execution_count": 8, "id": "0e632d54-b5cd-4cd1-8d3e-742e475a664a", "metadata": {}, "outputs": [], "source": [ "tokenizer.clean_up_tokenization_spaces = True\n", "tokenizer.add_tokens([\"\"])\n", "tokenizer.pad_token = \"\"\n", "tokenizer.add_eos_token = False\n", "\n", "model.resize_token_embeddings(new_num_tokens=len(tokenizer))\n", "model.config.eos_token_id = tokenizer.eos_token_id" ] }, { "cell_type": "code", "execution_count": 10, "id": "5f9e02fa-b89a-453f-adf8-383d7bd11b3c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Unsloth: Offloading input_embeddings to disk to save VRAM\n", "Unsloth: Offloading output_embeddings to disk to save VRAM\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Unsloth 2024.6 patched 26 layers with 26 QKV layers, 26 O layers and 26 MLP layers.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Unsloth: Casting embed_tokens to float32\n", "Unsloth: Casting lm_head to float32\n" ] } ], "source": [ "model = FastLanguageModel.get_peft_model(\n", " model,\n", " target_modules = [\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\",\n", " \"gate_proj\", \"up_proj\", \"down_proj\"],\n", " modules_to_save = [\"lm_head\", \"embed_tokens\"],\n", " lora_alpha = 16,\n", " r = 32,\n", " lora_dropout = 0,\n", " bias = \"none\",\n", " use_gradient_checkpointing=\"unsloth\",\n", " random_state=3407,\n", " use_rslora = True,\n", " loftq_config = None,\n", " max_seq_length = max_seq_length\n", ")\n", " " ] }, { "cell_type": "code", "execution_count": 11, "id": "93e95410-8f6b-4d4c-951b-5602397f3ce0", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7a9d00c6b33f423bb9c25b0261676f89", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Downloading builder script: 0%| | 0.00/25.0k [00:00 [INST] <>\\nOlet tekoälyavustaja. Vastaat aina mahdollisimman avuliaasti. Vastauksesi eivät saa sisältää mitään haitallista, epäeettistä, rasistista, seksististä, vaarallista tai laitonta sisältöä. Jos kysymyksessä ei ole mitään järkeä tai se ei ole asiasisällöltään johdonmukainen, selitä miksi sen sijaan, että vastaisit jotain väärin. Jos et tiedä vastausta kysymykseen, älä kerro väärää tietoa.\\n<>\\n\\nSaat seuraavana artikkelin tekstin. Tehtävänäsi on tuottaa otsikko artikkelin perusteella.\\n Artikkeli:\\nPosti kertoi eilen tiedotteessaan, että sen työntekijät siirtyvät tällä viikolla nurmikonleikkuusta lehtien haravoimiseen. Postin verkkokaupasta ja Postin omista myymälöistä voi tilata pihan haravoinnin haluamilleen kahdelle tiistaipäivälle. Syyslehdille voi myös tilata Postilta poisviennin.\\nSamaan aikaan, kun postin varsinaista palvelutehtävää — postilähetysten kuljettamista asiakkailleen — on heikennetty, valtionyhtiö tekee kaikkensa tunkeutuakseen yksityisten yritysten tonteille kiinteistönhoito- ja sosiaalitöihin.\\nSyksyn putoavien lehtien sijasta Postin tulisi keskittää tarmonsa siihen, miten se hoitaa tuoreiden lehtien eli paikallis- , sanoma- ja aikakauslehtien kuljetuksen. Tienoo tosin on hankkinut varhaiskantopalvelunsa yksityiseltä toimijalta, mutta Posti vie tai sen pitäisi viedä ydinaluetta kauempana oleville tilaajille lehdet määräaikoina. Käytännössä lehti menee asiakkaalle vasta seuraavana tai sitä seuraavana päivänä. Tuollainen toiminta on häpeällistä ja asiakasta väheksyvää.\\nNyt Posti haluaisi rukata postilakia niin, että postia kannettaisiin vain kolmena päivänä viikossa. Asiaan on ottanut jyrkän kielteisen kannan muun muassa Sanomalehtien Liitto. Se katsoo, että viisipäiväisyys on turvattava. Keinoina ovat eri jakelujen ja muiden palvelujen yhdistäminen. Taajamissa esimerkiksi päiväposti olisi mahdollista jakaa aamun sanomalehtijakelun yhteydessä. Haja-asutusalueella yhteistyötä Posti voisi tehdä yksityisten yrittäjien kanssa.\\nKun jo nyt monin paikoin Posti on omatoimisesti siirtynyt nelipäiväiseen jakeluun ja pantannut joskus loppuviikon postit seuraavalle viikolle, tärkeät kirjeet saattavat jäädä saamatta määräaikoina. Monipuolisen tiedonvälityksen vuoksi on lehdetkin toimitetava perille ilmestymispäivinä. Kun se on ollut ennekin mahdollista, miksei se nyt onnistuisi?\\nRauli Ala-Karvia\\n Nyt luo otsikko artikkelin perusteella. \\n Otsikko: [/INST] Postin tulisi kiinnostua myös tuoreista lehdistä'}" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset_filtered[0]" ] }, { "cell_type": "code", "execution_count": 24, "id": "a83682b6-ae4e-418c-939d-95bb9ec8b4e5", "metadata": {}, "outputs": [], "source": [ "from unsloth import UnslothTrainer, UnslothTrainingArguments\n", "import math\n", "\n", "batch_size = 4\n", "eval_batch_size = 4\n", "gradient_accumulation_steps = 4\n", "epochs = 1\n", "train_steps = math.ceil(len(dataset_filtered) / batch_size / gradient_accumulation_steps * epochs)\n", "eval_steps = math.floor(train_steps/epochs/5)\n", "warmup_steps = math.ceil(train_steps * 0.1)\n", "dataset_split = dataset_filtered.train_test_split(test_size=0.05)\n", "output_dir = 'train_checkpoints'" ] }, { "cell_type": "code", "execution_count": 25, "id": "a7447baf-4346-4916-a279-7e5a70bd2b06", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.10/dist-packages/transformers/training_args.py:1474: FutureWarning: `evaluation_strategy` is deprecated and will be removed in version 4.46 of 🤗 Transformers. Use `eval_strategy` instead\n", " warnings.warn(\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "3617098845674e3392bedfc21b9fab4a", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Map (num_proc=2): 0%| | 0/2850 [00:00\n", " \n", " \n", " [188/188 12:30, Epoch 1/2]\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
StepTraining LossValidation Loss
372.1507002.066879
741.9304001.996720
1111.8342001.981537
1482.0569001.977489
1851.6435001.976829

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.10/dist-packages/peft/utils/save_and_load.py:209: UserWarning: Setting `save_embedding_layers` to `True` as the embedding layer has been resized during finetuning.\n", " warnings.warn(\n", "/usr/local/lib/python3.10/dist-packages/peft/utils/save_and_load.py:209: UserWarning: Setting `save_embedding_layers` to `True` as the embedding layer has been resized during finetuning.\n", " warnings.warn(\n", "/usr/local/lib/python3.10/dist-packages/peft/utils/save_and_load.py:209: UserWarning: Setting `save_embedding_layers` to `True` as the embedding layer has been resized during finetuning.\n", " warnings.warn(\n", "/usr/local/lib/python3.10/dist-packages/peft/utils/save_and_load.py:209: UserWarning: Setting `save_embedding_layers` to `True` as the embedding layer has been resized during finetuning.\n", " warnings.warn(\n", "/usr/local/lib/python3.10/dist-packages/peft/utils/save_and_load.py:209: UserWarning: Setting `save_embedding_layers` to `True` as the embedding layer has been resized during finetuning.\n", " warnings.warn(\n" ] }, { "data": { "text/plain": [ "TrainOutput(global_step=188, training_loss=1.9880720529150455, metrics={'train_runtime': 754.5522, 'train_samples_per_second': 3.986, 'train_steps_per_second': 0.249, 'total_flos': 5.843729764618752e+16, 'train_loss': 1.9880720529150455, 'epoch': 1.0546984572230014})" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "trainer.train()" ] }, { "cell_type": "code", "execution_count": null, "id": "a06d56e0-f460-4f49-a737-8d74bdb49ca6", "metadata": {}, "outputs": [], "source": [ "from transfomers import GenerationConfig\n", "\n", "generation_config = GenerationConfig(\n", " pad_token_id = tokenizer.pad_token_id,\n", " eos_token_id = tokenizer.convert_tokens_to_ids(\"\")\n", ")" ] }, { "cell_type": "code", "execution_count": 37, "id": "df1a3b68-2212-4b95-a2dd-e973084e474a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "150" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(dataset_split[\"test\"])" ] }, { "cell_type": "code", "execution_count": 52, "id": "0e53b5a9-b5e4-4453-a275-e13f4fc67223", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------\n", " [INST] <>\n", "Olet tekoälyavustaja. Vastaat aina mahdollisimman avuliaasti. Vastauksesi eivät saa sisältää mitään haitallista, epäeettistä, rasistista, seksististä, vaarallista tai laitonta sisältöä. Jos kysymyksessä ei ole mitään järkeä tai se ei ole asiasisällöltään johdonmukainen, selitä miksi sen sijaan, että vastaisit jotain väärin. Jos et tiedä vastausta kysymykseen, älä kerro väärää tietoa.\n", "<>\n", "\n", "Saat seuraavana artikkelin tekstin. Tehtävänäsi on tuottaa otsikko artikkelin perusteella.\n", " Artikkeli:\n", "Tiedekeskus Heurekan Pokémon Go -päivä keräsi lauantaina paikalle järjestäjien laskujen mukaan noin 2 000 pelaajaa. Päivään kuului paitsi pelaamista, myös tutkijoiden luentoja pelaamisesta ja lisätystä todellisuudesta.\n", "”Lisätty todellisuus on kiinnostava ilmiö, ja nyt kun tällainen hyvin sosiaalinen peli on noussut pinnalle, halusimme tuoda aiheeseen tieteellisen näkökulman”, kertoo Heurekan tapahtumatuottaja Siina Vasama.\n", "”Paikalla oli teiniporukoita, paljon perheitä ja myös isovanhempia lapsenlapsineen”, Vasama kertoo.\n", "Pelaaminen tapahtui ulkona Heurekan edustalla. Tilaisuudessa jaettiin myös pelivinkkejä.\n", "Auditoriossa puolestaan yli 300 ihmistä oli kuuntelemassa pelitutkimukseen erikoistuneen professorin Frans Mäyrän ja Pokémonia tutkineen väitöskirjatutkijan Johannes Kosken puheenvuoroja, joissa he pohtivat muun muassa pelaamisen muuttumista ja lisätyn todellisuuden tulevaisuutta.\n", "Puheenvuoroissa pohdittiin myös pelaamisen hyväksyttävyyttä. Pelien on muun muassa pelätty vähentävän ihmisten välistä vuorovaikutusta.\n", "Tapahtuman järjestäjien kokemus on päinvastainen.\n", "”Ihmiset viettivät hyvin liikunnallista ja sosiaalista päivää ulkona ja juttelivat paljon keskenään. Tämän päivän kokemuksen perusteella kallistun sille kannalle, että peli lisäsi ulkoilua ja kanssakäymistä”, Vasama sanoo.\n", " Nyt luo otsikko artikkelin perusteella. \n", " Otsikko: [/INST] Heurekassa pelattiin Pokémon Go -peliä\n" ] } ], "source": [ "import random\n", "i = random.randint(0, len(dataset_split[\"test\"]))\n", "\n", "model.eval()\n", "\n", "inputs = tokenizer([tokenizer.apply_chat_template([{'role': 'user', 'content': dataset_split[\"test\"][i][\"instruction\"]}], tokenize=False)] * 1, return_tensors='pt').to(\"cuda\")\n", "\n", "with torch.no_grad():\n", " generation_ids = model.generate(\n", " input_ids = inputs[\"input_ids\"],\n", " attention_mask = inputs[\"attention_mask\"],\n", " generation_config = generation_config, **{\n", " \"temperature\": 0.7,\n", " \"penalty_alpha\": 0.6,\n", " \"min_p\": 0.5,\n", " \"do_sample\": True,\n", " \"repetition_penalty\": 1.28,\n", " \"min_length\": 6,\n", " \"max_new_tokens\": 50})\n", "\n", "generated_text = tokenizer.batch_decode(generation_ids, skip_special_tokens = False, cleanup_tokenization_spaces = True)[0]\n", "print('--------')\n", "print(generated_text)\n", " " ] }, { "cell_type": "code", "execution_count": null, "id": "aba8b4ce-2914-45fb-ad3e-a23f75b57f28", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 5 }