Lewati ke konten utama

Fine-Tuning Llama 3.1 untuk Klasifikasi Teks

Mulai gunakan model Llama baru dan kustomisasi Llama-3.1-8B-It untuk memprediksi berbagai gangguan kesehatan mental dari teks.
Diperbarui 28 Sep 2026  · 13 mnt Baca

Jelajahi bersama AI

ChatGPTClaudePerplexity

Sebelum kita mulai, sebuah catatan: saat membahas use case AI di layanan kesehatan, sangat penting untuk mewaspadai potensi dampak yang berbahaya bagi pasien. Contoh di bawah ini, meskipun komprehensif, semata-mata dimaksudkan untuk mengilustrasikan fine-tuning pada dataset dunia nyata. Jika Anda mengejar use case AI di layanan kesehatan atau domain sensitif lainnya, kami sangat merekomendasikan membaca panduan kami tentang Etika AI.

Dalam tutorial ini, kita akan mempelajari model Llama 3.1 dan melakukan fine-tune pada model Llama-3.1-8b-It untuk analisis sentimen pada dataset kesehatan mental. Tujuan kita adalah menyesuaikan model agar dapat memprediksi status kesehatan mental pasien berdasarkan teks. Kita juga akan menggabungkan adapter dengan model dasar dan menyimpan model lengkap di Hugging Face Hub. 

Kita akan mempelajari model Llama 3.1, cara mengaksesnya di Kaggle, dan cara menggunakan pustaka Transformer untuk menjalankan inferensi model. Kita juga akan melakukan fine-tune pada model Llama-3.1-8b-It pada dataset klasifikasi kesehatan mental. Terakhir, kita akan menggabungkan adapter yang disimpan dengan model dasar dan mendorong model lengkap ke Hugging Face Hub.

Jika Anda baru dalam topik ini, Anda dapat mempelajari teori di balik fine-tuning dengan membaca artikel kami, Panduan Pengantar Fine-Tuning LLM. 

Gambar oleh Penulis

Mengenal Llama 3.1

Llama 3.1 adalah seri terbaru model bahasa besar multibahasa (LLM) yang dikembangkan oleh Meta AI, yang mendorong batas pemahaman dan generasi bahasa. Model ini hadir dalam tiga ukuran: 8B, 70B, dan 405B parameter.

Model Llama 3.1 dibangun di atas arsitektur model bahasa auto-regresif dengan transformer yang dioptimalkan dan dapat di-fine-tune untuk berbagai tugas dan dataset pemrosesan bahasa alami. Model ini dilatih pada beragam dataset data daring yang tersedia untuk umum, mendukung delapan bahasa (Inggris, Jerman, Prancis, Italia, Portugis, Hindi, Spanyol, dan Thai), dan hadir dengan panjang konteks 128k. 

Model Llama 3.1 tersedia untuk semua orang di bawah lisensi komersial kustom dan memerlukan informasi minimal tentang individu untuk mengunduh bobot model.

Llama 3.1 dioptimalkan untuk dialog multibahasa dan melampaui Gemma 2, GPT 3.5 turbo, dan GPT-4o pada berbagai tolok ukur, termasuk obrolan umum, pengkodean, matematika, penalaran, dan lainnya. Ini adalah model open source tercepat dan paling akurat yang tersedia sejauh ini.

Llama 3.1 benchmark

Sumber: Llama 3.1 (meta.com)

Anda dapat mempelajari lebih lanjut tentang model Llama 3.1 dengan membaca Apa Itu Llama 3.1 405B dari Meta? Cara Kerja, Use Case, dan Lainnya.

Memulai dengan Llama 3.1

Untuk tutorial ini, kita akan menggunakan Kaggle Notebook sebagai lingkungan pengembangan karena menyediakan GPU dan TPU gratis. Untuk menggunakan model Llama 3.1 di Kaggle notebook, ikuti langkah-langkah berikut:

1. Isi formulir di meta.com dengan alamat email yang sama dengan akun Kaggle Anda.

2. Akses repositori model Meta | Llama 3.1 di Kaggle dan klik tombol "access the model". Terima semua syarat, dan setelah beberapa detik, Anda akan mendapat akses ke model.

Mengakses Llama 3.1 di Kaggle

3. Mulai Kaggle notebook dengan model Llama 3.1 dengan mengklik tombol "Code" di kanan atas halaman model.

Memulai Kaggle notebook.

4. Pilih framework, variasi, dan versi, lalu tekan tombol "Add Model".

Memilih versi yang tepat dari model Llama 3.1.

5. Instal paket Python yang diperlukan di Kaggle notebook menggunakan perintah berikut:

%pip install -U transformers accelerate

6. Muat model dan tokenizer menggunakan pustaka Transformers dari direktori lokal.

7. Buat pipeline generasi teks dengan model, tokenizer, tipe torch, dan peta perangkat.

from transformers import AutoTokenizer,AutoModelForCausalLM,pipeline
import torch

base_model = "/kaggle/input/llama-3.1/transformers/8b-instruct/1"

tokenizer = AutoTokenizer.from_pretrained(base_model)

model = AutoModelForCausalLM.from_pretrained(
        base_model,
        return_dict=True,
        low_cpu_mem_usage=True,
        torch_dtype=torch.float16,
        device_map="auto",
        trust_remote_code=True,
)
pipe = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.float16,
    device_map="auto",
)

8. Tulis pesan dan ubah menjadi prompt yang sesuai menggunakan templat chat.

9. Jalankan pipeline menggunakan prompt dan cetak keluaran yang dihasilkan.

messages = [{"role": "user", "content": "What is the tallest building in the world?"}]

prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
outputs = pipe(prompt, max_new_tokens=120, do_sample=True)
print(outputs[0]["generated_text"])

Jawabannya akurat dan mendetail. 

Keluaran generasi respons menggunakan model Llama 3.1

Jika Anda menemui kesulitan dalam menjalankan inferensi model, silakan merujuk ke Kaggle Notebook di Llama 3.1 Simple Model Inference. 

Fine-tuning Llama 3.1 untuk Klasifikasi Gangguan Kesehatan Mental 

Sekarang, kita harus memuat dataset, memprosesnya, dan melakukan fine-tune pada model Llama 3.1. Kita juga akan membandingkan kinerja model sebelum dan sesudah fine-tuning.

Jika Anda baru mengenal LLM, saya menyarankan Anda mengambil kursus Master Large Language Models (LLMs) Concepts sebelum masuk ke bagian fine-tuning pada tutorial ini.

1. Menyiapkan lingkungan

Pertama, kita akan memulai Kaggle notebook baru dan model Llama 3.1 seperti pada bagian sebelumnya.

Kemudian kita akan memasang paket Python yang diperlukan seperti di bawah ini:

%%capture
%pip install -U bitsandbytes
%pip install -U transformers
%pip install -U accelerate
%pip install -U peft
%pip install -U trl

Selanjutnya, kita menambahkan data Sentiment Analysis for Mental Health ke Kaggle notebook.  Untuk melakukannya, klik tombol “Add Input” di kanan atas dan tempel tautan model ke bilah pencarian. Lalu, untuk menambahkan model, cukup klik tombol plus (+).

Menambahkan dataset Sentimental analysis for Mental health di Kaggle notebook.

Kita akan melacak kinerja model menggunakan API Weights and Biases. Untuk mengakses API, kita memerlukan kunci API. Atur kunci API di Kaggle menggunakan Secrets dan aktifkan, seperti di bawah ini.  

Mengaktifkan w&b secrets agar dapat diakses di notebook secara aman.

Kita kemudian dapat memulai proyek Weights and Biases menggunakan kunci API.

import wandb

from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()

wb_token = user_secrets.get_secret("wandb")

wandb.login(key=wb_token)
run = wandb.init(
    project='Fine-tune llama-3.1-8b-it on Sentiment Analysis Dataset', 
    job_type="training", 
    anonymous="allow"
)

Berikutnya, kita perlu mengimpor semua paket dan fungsi Python yang diperlukan.

import numpy as np
import pandas as pd
import os
from tqdm import tqdm
import bitsandbytes as bnb
import torch
import torch.nn as nn
import transformers
from datasets import Dataset
from peft import LoraConfig, PeftConfig
from trl import SFTTrainer
from trl import setup_chat_format
from transformers import (AutoModelForCausalLM, 
                          AutoTokenizer, 
                          BitsAndBytesConfig, 
                          TrainingArguments, 
                          pipeline, 
                          logging)
from sklearn.metrics import (accuracy_score, 
                             classification_report, 
                             confusion_matrix)
from sklearn.model_selection import train_test_split

2. Memuat dan memproses dataset

Sekarang saatnya kita memuat dataset, melakukan pembersihan data, dan menghapus tiga kategori yang ambigu. 

Untuk menyederhanakan, kita akan menghapus kategori "Suicidal" karena Llama 3.1 memiliki mekanisme keamanan untuk mencegah kata-kata tertentu yang memicu. "Stress" tidak dianggap sebagai gangguan mental, dan "Personality Disorder" memiliki banyak tumpang tindih dengan "Bipolar Disorder." 

Akibatnya, kita hanya akan menyisakan empat kategori: "Normal," "Depression," "Anxiety," dan "Bipolar."

df = pd.read_csv("/kaggle/input/sentiment-analysis-for-mental-health/Combined Data.csv",index_col = "Unnamed: 0")
df.loc[:,'status'] = df.loc[:,'status'].str.replace('Bi-Polar','Bipolar')
df = df[(df.status != "Personality disorder") & (df.status != "Stress") & (df.status != "Suicidal")]
df.head()

5 baris teratas dataset

Untuk menghemat waktu pelatihan, kita akan melakukan fine-tune model hanya pada 3000 sampel. Untuk itu, kita akan mengacak dataset dan memilih 3000 baris. 

Kemudian kita akan membagi dataset menjadi set train, eval, dan test untuk pelatihan dan pengujian model. 

Kita juga ingin membuat kolom “text” di set train dan eval menggunakan fungsi generate_prompt, yang menggabungkan data dari kolom “statement” dan “status”. 

Terakhir, kita akan membuat kolom “text” di set test menggunakan fungsi generate_test_prompt dan y_true menggunakan kolom “status”. Kita akan menggunakannya untuk menghasilkan laporan evaluasi model, seperti di bawah ini.

# Shuffle the DataFrame and select only 3000 rows
df = df.sample(frac=1, random_state=85).reset_index(drop=True).head(3000)

# Split the DataFrame
train_size = 0.8
eval_size = 0.1

# Calculate sizes
train_end = int(train_size * len(df))
eval_end = train_end + int(eval_size * len(df))

# Split the data
X_train = df[:train_end]
X_eval = df[train_end:eval_end]
X_test = df[eval_end:]

# Define the prompt generation functions
def generate_prompt(data_point):
    return f"""
            Classify the text into Normal, Depression, Anxiety, Bipolar, and return the answer as the corresponding mental health disorder label.
text: {data_point["statement"]}
label: {data_point["status"]}""".strip()

def generate_test_prompt(data_point):
    return f"""
            Classify the text into Normal, Depression, Anxiety, Bipolar, and return the answer as the corresponding mental health disorder label.
text: {data_point["statement"]}
label: """.strip()

# Generate prompts for training and evaluation data
X_train.loc[:,'text'] = X_train.apply(generate_prompt, axis=1)
X_eval.loc[:,'text'] = X_eval.apply(generate_prompt, axis=1)

# Generate test prompts and extract true labels
y_true = X_test.loc[:,'status']
X_test = pd.DataFrame(X_test.apply(generate_test_prompt, axis=1), columns=["text"])

Pada titik ini, kita ingin memeriksa distribusi kategori di set train.

X_train.status.value_counts()

Anda dapat melihat di bawah bahwa kita memiliki distribusi yang hampir seimbang untuk kategori "Normal" dan "Depression". Sisanya adalah label minoritas. Ini berarti dataset kita tidak seimbang, dan model akan lebih baik dalam memprediksi label mayoritas dibandingkan label minoritas. 

Kita bisa menyeimbangkan dataset, tetapi itu bukan tujuan tutorial ini.

status
Normal        1028
Depression     938
Anxiety        258
Bipolar        176
Name: count, dtype: int64

Selanjutnya, kita ingin mengonversi set train dan eval menjadi dataset Hugging Face.

# Convert to datasets
train_data = Dataset.from_pandas(X_train[["text"]])
eval_data = Dataset.from_pandas(X_eval[["text"]])

Lalu, kita tampilkan sampel ke-4 dari kolom “text”.

train_data['text'][3]

Kita melihat bahwa kolom “text” memiliki system prompt, pernyataan, dan status sebagai label. 

3. Memuat model dan tokenizer

Berikutnya, kita ingin memuat model Llama-3.1-8b-instruct dalam kuantisasi 4-bit untuk menghemat memori GPU. 

Kemudian kita akan memuat tokenizer dan menetapkan pad token id. 

base_model_name = "/kaggle/input/llama-3.1/transformers/8b-instruct/1"

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_use_double_quant=False,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype="float16",
)

model = AutoModelForCausalLM.from_pretrained(
    base_model_name,
    device_map="auto",
    torch_dtype="float16",
    quantization_config=bnb_config, 
)

model.config.use_cache = False
model.config.pretraining_tp = 1

tokenizer = AutoTokenizer.from_pretrained(base_model_name)

tokenizer.pad_token_id = tokenizer.eos_token_id

4. Evaluasi model sebelum fine-tuning

Di sini, kita membuat fungsi predict yang akan menggunakan pipeline generasi teks untuk memprediksi label dari kolom “text”. Menjalankan fungsi akan mengembalikan daftar kategori gangguan mental berdasarkan berbagai sampel di set pengujian. 

def predict(test, model, tokenizer):
    y_pred = []
    categories = ["Normal", "Depression", "Anxiety", "Bipolar"]
    
    for i in tqdm(range(len(test))):
        prompt = test.iloc[i]["text"]
        pipe = pipeline(task="text-generation", 
                        model=model, 
                        tokenizer=tokenizer, 
                        max_new_tokens=2, 
                        temperature=0.1)
        
        result = pipe(prompt)
        answer = result[0]['generated_text'].split("label:")[-1].strip()
        
        # Determine the predicted category
        for category in categories:
            if category.lower() in answer.lower():
                y_pred.append(category)
                break
        else:
            y_pred.append("none")
    
    return y_pred

y_pred = predict(X_test, model, tokenizer)
100%|██████████| 300/300 [02:54<00:00,  1.72it/s]

Setelah itu, kita membuat fungsi evaluate yang akan menggunakan label prediksi dan label sebenarnya untuk menghitung akurasi keseluruhan model dan akurasi per kategori, menghasilkan laporan klasifikasi, dan mencetak matriks kebingungan. Menjalankan fungsi akan memberikan ringkasan evaluasi model secara mendetail. 

def evaluate(y_true, y_pred):
    labels = ["Normal", "Depression", "Anxiety", "Bipolar"]
    mapping = {label: idx for idx, label in enumerate(labels)}
    
    def map_func(x):
        return mapping.get(x, -1)  # Map to -1 if not found, but should not occur with correct data
    
    y_true_mapped = np.vectorize(map_func)(y_true)
    y_pred_mapped = np.vectorize(map_func)(y_pred)
    
    # Calculate accuracy
    accuracy = accuracy_score(y_true=y_true_mapped, y_pred=y_pred_mapped)
    print(f'Accuracy: {accuracy:.3f}')
    
    # Generate accuracy report
    unique_labels = set(y_true_mapped)  # Get unique labels
    
    for label in unique_labels:
        label_indices = [i for i in range(len(y_true_mapped)) if y_true_mapped[i] == label]
        label_y_true = [y_true_mapped[i] for i in label_indices]
        label_y_pred = [y_pred_mapped[i] for i in label_indices]
        label_accuracy = accuracy_score(label_y_true, label_y_pred)
        print(f'Accuracy for label {labels[label]}: {label_accuracy:.3f}')
        
    # Generate classification report
    class_report = classification_report(y_true=y_true_mapped, y_pred=y_pred_mapped, target_names=labels, labels=list(range(len(labels))))
    print('\nClassification Report:')
    print(class_report)
    
    # Generate confusion matrix
    conf_matrix = confusion_matrix(y_true=y_true_mapped, y_pred=y_pred_mapped, labels=list(range(len(labels))))
    print('\nConfusion Matrix:')
    print(conf_matrix)

evaluate(y_true, y_pred)

Llama 3.1 berkinerja sangat baik, bahkan tanpa fine-tuning. Akurasi 79% sudah cukup baik. Mari kita lihat bagaimana model kita meningkat saat kita melakukan fine-tune pada dataset.

Accuracy: 0.790
Accuracy for label Normal: 0.741
Accuracy for label Depression: 0.939
Accuracy for label Anxiety: 0.556
Accuracy for label Bipolar: 0.533

Classification Report:
              precision    recall  f1-score   support

      Normal       0.92      0.74      0.82       143
  Depression       0.70      0.94      0.80       115
     Anxiety       0.68      0.56      0.61        27
     Bipolar       0.89      0.53      0.67        15

    accuracy                           0.79       300
   macro avg       0.80      0.69      0.73       300
weighted avg       0.81      0.79      0.79       300


Confusion Matrix:
[[106  33   4   0]
 [  3 108   3   1]
 [  4   8  15   0]
 [  2   5   0   8]]

5. Membangun model

Saat membangun model, kita mulai dengan mengekstrak nama modul linear dari model menggunakan pustaka bits and bytes. 

Kemudian kita mengonfigurasi LoRA menggunakan modul target, jenis tugas, dan argumen lainnya sebelum menyiapkan argumen pelatihan. Argumen pelatihan ini dioptimalkan untuk Kaggle notebook. Anda mungkin perlu mengubahnya jika menggunakannya secara lokal. 

Lalu kita akan membuat pelatih model menggunakan argumen pelatihan, model, tokenizer, konfigurasi LoRA, dan dataset. 

import bitsandbytes as bnb

def find_all_linear_names(model):
    cls = bnb.nn.Linear4bit
    lora_module_names = set()
    for name, module in model.named_modules():
        if isinstance(module, cls):
            names = name.split('.')
            lora_module_names.add(names[0] if len(names) == 1 else names[-1])
    if 'lm_head' in lora_module_names:  # needed for 16 bit
        lora_module_names.remove('lm_head')
    return list(lora_module_names)
modules = find_all_linear_names(model)
modules
['down_proj', 'gate_proj', 'o_proj', 'v_proj', 'up_proj', 'q_proj', 'k_proj']
output_dir="llama-3.1-fine-tuned-model"

peft_config = LoraConfig(
    lora_alpha=16,
    lora_dropout=0,
    r=64,
    bias="none",
    task_type="CAUSAL_LM",
    target_modules=modules,
)

training_arguments = TrainingArguments(
    output_dir=output_dir,                    # directory to save and repository id
    num_train_epochs=1,                       # number of training epochs
    per_device_train_batch_size=1,            # batch size per device during training
    gradient_accumulation_steps=8,            # number of steps before performing a backward/update pass
    gradient_checkpointing=True,              # use gradient checkpointing to save memory
    optim="paged_adamw_32bit",
    logging_steps=1,                         
    learning_rate=2e-4,                       # learning rate, based on QLoRA paper
    weight_decay=0.001,
    fp16=True,
    bf16=False,
    max_grad_norm=0.3,                        # max gradient norm based on QLoRA paper
    max_steps=-1,
    warmup_ratio=0.03,                        # warmup ratio based on QLoRA paper
    group_by_length=False,
    lr_scheduler_type="cosine",               # use cosine learning rate scheduler
    report_to="wandb",                  # report metrics to w&b
    eval_strategy="steps",              # save checkpoint every epoch
    eval_steps = 0.2
)

trainer = SFTTrainer(
    model=model,
    args=training_arguments,
    train_dataset=train_data,
    eval_dataset=eval_data,
    peft_config=peft_config,
    dataset_text_field="text",
    tokenizer=tokenizer,
    max_seq_length=512,
    packing=False,
    dataset_kwargs={
    "add_special_tokens": False,
    "append_concat_token": False,
    }
)

6. Pelatihan model

Sekarang saatnya memulai pelatihan model:

trainer.train()

Diperlukan 1,5 jam untuk melakukan fine-tune model, dan validation loss kita menurun secara bertahap. Untuk kinerja yang lebih baik, coba latih model pada seluruh dataset setidaknya selama lima epoch.

Log pelatihan model

Selanjutnya, kita akhiri run weights and biases.

wandb.finish()
model.config.use_cache = True

Kita akan dapat melihat ringkasan run, termasuk semua metrik yang diperlukan untuk kinerja model.

Ringkasan run w&b

Untuk melihat ringkasan mendetail, buka akun Weights and Biases Anda dan lihat run di browser. Tersedia visualisasi interaktif.

Visualisasi mendetail ringkasan run di situs weights and biases.

Kita kemudian dapat menyimpan adapter model dan tokenizer secara lokal. Pada bagian berikutnya, kita akan menggunakannya untuk menggabungkan adopter dengan model dasar.

# Save trained model and tokenizer
trainer.save_model(output_dir)
tokenizer.save_pretrained(output_dir)

7. Menguji model setelah fine-tuning

Sekarang tiba bagian yang paling krusial. Apakah model kita akan berkinerja lebih baik setelah di-fine-tune, atau malah menurun? Untuk mengetahuinya, kita harus menjalankan fungsi 'predict' pada set test dan kemudian fungsi 'evaluate' untuk menghasilkan laporan evaluasi model.

y_pred = predict(X_test, model, tokenizer)
evaluate(y_true, y_pred)

Seperti yang terlihat dari hasil di bawah, ini adalah peningkatan besar dalam kinerja model, dari 79% menjadi 91,3% akurasi. Bahkan skor F1 juga terlihat bagus. 

100%|██████████| 300/300 [03:24<00:00,  1.47it/s]
Accuracy: 0.913
Accuracy for label Normal: 0.972
Accuracy for label Depression: 0.913
Accuracy for label Anxiety: 0.667
Accuracy for label Bipolar: 0.800

Classification Report:
              precision    recall  f1-score   support

      Normal       0.92      0.97      0.95       143
  Depression       0.93      0.91      0.92       115
     Anxiety       0.75      0.67      0.71        27
     Bipolar       1.00      0.80      0.89        15

    accuracy                           0.91       300
   macro avg       0.90      0.84      0.87       300
weighted avg       0.91      0.91      0.91       300


Confusion Matrix:
[[139   3   1   0]
 [  5 105   5   0]
 [  6   3  18   0]
 [  1   2   0  12]]

Sekarang kita dapat menyimpan Kaggle notebook untuk menyimpan hasil dan file model. Untuk itu, klik tombol “Save Version” di kanan atas, pilih tipe versi “Quick Save,” dan pilih tipe penyimpanan output “Always save output when creating a Quick Save.”

Jika Anda mengalami kendala saat melakukan fine-tuning model, silakan merujuk ke notebook Kaggle untuk bantuan lebih lanjut. 

Anda juga dapat mempelajari cara melakukan fine-tune model Llama 3.0 dengan mengikuti panduan kami, Fine-Tuning Llama 3 dan Menggunakannya Secara Lokal. 

Menggabungkan dan Menyimpan Model Llama 3.1 yang Telah Di-fine-tune

Pada bagian ini, kita akan menggabungkan adapter dengan model dasar dan menyimpan versi lengkapnya di Hugging Face hub. 

Pertama, kita meluncurkan Kaggle notebook baru dengan akselerasi GPU dan menambahkan notebook yang disimpan untuk mengakses file model. Kita juga dapat menyertakan Kaggle notebook lainnya sebagai input, mirip seperti menambahkan dataset.

Menambahkan notebook sebagai dataset di Kaggle Notebook.

Kemudian kita dapat memasang paket Python yang diperlukan. 

%%capture
%pip install -U bitsandbytes
%pip install -U transformers
%pip install -U accelerate
%pip install -U peft

Selanjutnya, kita masuk ke API Hugging Face hub menggunakan kunci API untuk mendorong file model kita ke repositori model Hugging Face. 

from huggingface_hub import login
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()

hf_token = user_secrets.get_secret("HUGGINGFACE_TOKEN")
login(token = hf_token)

Kemudian kita tetapkan direktori model dasar dan model yang telah di-fine-tune.

base_model = "/kaggle/input/llama-3.1/transformers/8b-instruct/1"
fine_tuned_model = "/kaggle/input/fine-tune-llama-3-1-for-text-classification/llama-3.1-fine-tuned-model/"

Lalu, muat tokenizer dan model dasar. 

from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
from peft import PeftModel
import torch


# Reload tokenizer and model
tokenizer = AutoTokenizer.from_pretrained(base_model)

base_model_reload = AutoModelForCausalLM.from_pretrained(
        base_model,
        return_dict=True,
        low_cpu_mem_usage=True,
        torch_dtype=torch.float16,
        device_map="auto",
        trust_remote_code=True,
)

Kita menggabungkan model dasar dengan adapter yang di-fine-tune, seperti di bawah ini. 

# Merge adapter with base model
model = PeftModel.from_pretrained(base_model_reload, fine_tuned_model)
model = model.merge_and_unload()

Sebelum menyimpan model, mari periksa apakah model berfungsi dengan benar. Buat pipeline generasi teks dengan model dan tokenizer lalu berikan prompt contoh. 

text = "I'm trapped in a storm of emotions that I can't control, and it feels like no one understands the chaos inside me"
prompt = f"""Classify the text into Normal, Depression, Anxiety, Bipolar, and return the answer as the corresponding mental health disorder label.
text: {text}
label: """.strip()

pipe = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.float16,
    device_map="auto",
)

outputs = pipe(prompt, max_new_tokens=2, do_sample=True, temperature=0.1)
print(outputs[0]["generated_text"].split("label: ")[-1].strip())

Model kita berfungsi dengan sangat baik.

Depression

Sekarang kita dapat menyimpan model dan tokenizer secara lokal. 

model_dir = "Llama-3.1-8B-Instruct-Mental-Health-Classification"
model.save_pretrained(model_dir)
tokenizer.save_pretrained(model_dir)

Dan kemudian mendorong model dan tokenizer ke Hugging Face Hub.

model.push_to_hub(model_dir, use_temp_dir=False)
tokenizer.push_to_hub(model_dir, use_temp_dir=False)

Ini akan membuat repositori di Hugging Face dan mendorong semua file model dan tokenizer.

CommitInfo(commit_url='https://huggingface.co/kingabzpro/Llama-3.1-8B-Instruct-Mental-Health-Classification/commit/e1244abeaac159e0a48439095200a4190c2b493c', commit_message='Upload tokenizer', commit_description='', oid='e1244abeaac159e0a48439095200a4190c2b493c', pr_url=None, pr_revision=None, pr_num=None)

Kita dapat melihat semua file model dengan mengunjungi situs web Hugging Face. 

Repositori model yang telah di-fine-tune di Hugging Face.

Sumber: kingabzpro/Llama-3.1-8B-Instruct-Mental-Health-Classification · Hugging Face

Jika Anda mengalami masalah saat menggabungkan adapter dengan model dasar, silakan merujuk ke Kaggle notebook.

Jika Anda merasa fine-tuning LLM itu sulit, Anda dapat mengikuti tutorial Fine-Tuning OpenAI's GPT-4: A Step-by-Step Guide untuk mempelajari cara yang lebih mudah menggunakan OpenAI API untuk melakukan fine-tune model pada dataset apa pun hanya dengan beberapa baris kode.

Pemikiran Akhir

Fine-tuning model tidak terbatas pada kustomisasi berdasarkan dataset. Kita dapat melakukan fine-tune model bahasa besar pada berbagai tugas bahasa alami seperti penerjemahan mesin, pengelompokan, klasifikasi, tanya jawab, embedding, dan lainnya. 

Dalam tutorial ini, kita telah mempelajari cara melakukan fine-tune model Llama 3.1 pada dataset klasifikasi kesehatan mental. Model ini dapat digunakan untuk mengidentifikasi pasien bahkan karyawan yang menghadapi tantangan dalam kehidupan sehari-hari mereka.

Jika Anda bertanya-tanya bagaimana cara memulai dengan LLM dan mulai melakukan fine-tune model sendiri, maka Anda harus mempertimbangkan untuk mengambil jalur keterampilan Developing Large Language Models. Dengan rangkaian kursus ini, Anda akan membangun fondasi yang kuat dalam LLM, mendorong Anda memasuki lanskap baru yang didukung AI.


Abid Ali Awan's photo
Author
Abid Ali Awan
LinkedIn
Twitter

Sebagai data scientist tersertifikasi, saya bersemangat memanfaatkan teknologi mutakhir untuk menciptakan aplikasi machine learning yang inovatif. Dengan latar belakang kuat di pengenalan ucapan, analisis dan pelaporan data, MLOps, conversational AI, dan NLP, saya mengasah keterampilan dalam mengembangkan sistem cerdas yang berdampak nyata. Selain keahlian teknis, saya juga komunikator andal yang mampu menyederhanakan konsep kompleks menjadi bahasa yang jelas dan ringkas. Karena itu, saya menjadi blogger yang dicari di bidang data science, membagikan wawasan dan pengalaman kepada komunitas profesional data yang terus berkembang. Saat ini, saya berfokus pada pembuatan dan penyuntingan konten, bekerja dengan large language model untuk mengembangkan konten yang kuat dan menarik agar membantu bisnis dan individu memaksimalkan data mereka.

Topik
Kecerdasan Buatan

Kursus LLM Terbaik di DataCamp

Kursus

Bekerja dengan Llama 3

2 jam
15.7K
Jelajahi teknik terbaru untuk menjalankan Llama LLM secara lokal dan mengintegrasikannya ke dalam stack Anda.
Lihat DetailRight Arrow
Mulai Kursus
Lihat SelengkapnyaRight Arrow
Terkait

blogs

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

blogs

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

blogs

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

Lihat SelengkapnyaLihat Selengkapnya