Adaptasi Peringkat Rendah (LoRa) adalah metode yang efisien dari [penyempurnaan] (https://www.ibm.com/id-id/think/topics/fine-tuning) yang mengurangi jumlah parameter dapat dilatih yang meningkatkan kecepatan dan penggunaan sumber daya pelatihan sekaligus mempertahankan kualitas output yang sama. Alih-alih memperbarui semua parameter dalam neural networks selama penyempurnaan, LoRA mengunci bobot asli yang telah dilatih sebelumnya dan menambahkan matriks peringkat rendah dapat dilatih berukuran kecil yang memperkirakan perubahan yang diperlukan untuk tugas baru. Pendekatan ini didasarkan pada hipotesis bahwa pembaruan bobot selama adaptasi memiliki "peringkat intrinsik" yang rendah.
Satu manfaat tambahan dari LoRA adalah karena bobot terlatih tetap dikunci, adaptor yang dihasilkan ringan dan portabel, dan mudah disimpan.
Dalam tutorial ini, Anda akan menggunakan LLaMa Factory. LLaMa Factory adalah model bahasa besar Pelatihan (LLM) dan menyempurnakan platform rendah no-code yang memungkinkan pengguna untuk menyetel LLM pada kumpulan data khusus, mengevaluasi kinerja, dan melayani model. Model bahasa besar ini memiliki UI web dan CLI yang mudah digunakan dan mendukung lebih dari 100 LLM. Toolkit ini mendukung kumpulan data dalam format Alpaca dan ShareGPT. LLaMa Factory bukan satu-satunya cara untuk menyempurnakan LLM, [PEFT] (https://www.ibm.com/id-id/think/topics/parameter-efficient-fine-tuning) pustaka untuk penyempurnaan dengan parameter yang efisien adalah pilihan lain untuk memperbarui model besar. PEFT menyediakan kemampuan untuk melakukan LoRa (QLoRa) [dikuantifikasi] (https://www.ibm.com/id-id/think/topics/quantization) untuk lebih memadatkan model yang disempurnakan. Dalam tutorial ini, Anda akan menggunakan versi Granite 3.3 yang tidak dikuantisasi.
Meskipun LLama Factory dapat berjalan tanpa menggunakan sumber daya komputasi yang luas, namun toolkit ini membutuhkan [GPU] (https://www.ibm.com/id-id/think/topics/gpu) dan sumber daya memori yang sangat besar. Dalam tutorial ini, Anda akan menggunakan LLama Factory di watsonx untuk menyediakan sumber daya GPU dan penyimpanan untuk adaptor yang dihasilkan.
Konfigurasi Watson Studio
a. Masuk ke watsonx.ai menggunakan akun IBM® Cloud Anda.
b. Buat proyek watsonx.ai. Catat ID proyek Anda di bagian proyek > Kelola > Umum > ID Proyek.
Anda akan memerlukan ID ini untuk tutorial ini.
c. Buat instans layanan waktu proses watsonx.ai. Untuk tutorial ini, Anda harus membuat instans berbayar untuk mengakses GPU.
d. Buat antarmuka pemrograman aplikasi watsonx (Kunci API).
e. Kaitkan layanan waktu proses watsonx.ai ke proyek yang Anda buat di watsonx.ai.
Cloud Object Storage
a. Untuk membuat Cloud Object Storage untuk notebook Anda, Anda harus membuka https://cloud.ibm.com/ lalu memilih “Buat Instans”.
b. Tindakan ini akan membawa Anda ke dialog pembuatan di mana Anda dapat memilih paket harga. Untuk tutorial ini, paket standar sudah memadai.
c. Kemudian, beri nama instans Cloud Object Storage Anda.
d. Setelah membuat Instans, kembali ke Proyek dan pilih “Aset Baru”, lalu pilih “Hubungkan ke sumber data”.
e. Pilih "Cloud Object Storage" f. Dalam dialog berikutnya, pilih Instans yang Anda buat dalam langkah a—d berdasarkan nama.
g. Pilih "Buat".
Buat Jupyter Notebook.
a. Pilih tab Aset di lingkungan proyek Anda.
b. Klik Aset baru.
c. Pilih opsi Bekerja dengan model di panel kiri.
d. Klik Bekerja dengan data dan model dengan menggunakan notebook Python dan R.
e. Masukkan nama untuk notebook Anda di bidang Nama. Pilih Runtime 23.1 pada Python (4 vCPU 16 GB RAM) untuk menentukan konfigurasi.
f. Pilih Buat.
Selanjutnya, Anda akan menginstal dependensi ke waktu proses. Pertama, llama-factory untuk menghasilkan adaptor peringkat rendah, dan kemudian Pandas untuk memformat kumpulan data dalam format Alpaca.
!pip install -q llamafactory 2>/dev/null
# pandas needed to format the dataset
!pip install -q --upgrade pandas 2>/dev/null
Selanjutnya, Anda akan memastikan bahwa lingkungan watsonx Anda telah menyediakan GPU yang kompatibel dengan Torch yang akan diperlukan untuk menggunakan Llama-factory.
import torch
try:
assert torch.cuda.is_available() is True
except AssertionError:
print("No GPU found, please set up a GPU before using LLaMA Factory.")
Jika cuplikan kode sebelumnya tidak mencetak " Tidak ada GPU yang ditemukan, " maka Anda siap.
Selanjutnya, Anda akan mengimpor pustaka untuk memanipulasi data dan untuk membuat file konfigurasi LLama Factory yang digunakan untuk pelatihan.
# Import libraries
import pandas as pd
import json
import yaml
Dalam tutorial ini, Anda akan menggunakan bagian dari [MedReason] (https://github.com/UCSC-VLAA/MedReason) kumpulan data. MedReason adalah kumpulan data penalaran medis berkualitas tinggi skala besar yang dirancang untuk membantu memungkinkan pemecahan masalah medis yang dapat dijelaskan di LLM. Sementara MedReason berfokus pada penalaran model dan memvalidasi rantai pemikiran yang digunakan model, dalam hal ini juga membantu untuk menyediakan kumpulan data yang terlalu baru untuk dimasukkan dalam data pelatihan untuk IBM® Granite® 3.3.
Granite 3.3 telah dirancang untuk belajar melalui penyempurnaan, yang keduanya akan dijalankan dengan LLama Factory. Model Granite dapat disetel secara efisien bahkan dengan sumber daya terbatas.
Anda akan memuat pilihan kumpulan data MedReason dari GitHub:
from datasets import load_dataset
training = pd.read_json("https://raw.githubusercontent.com/UCSC-VLAA/MedReason/refs/heads/main/eval_data/medbullets_op4.jsonl", lines=True)
LLaMa Factory mengharuskan kumpulan data diformat sebelumnya dalam format Alpaca atau ShareGPT. Dengan demikian, kami memformat ulang bidang pertanyaan dan jawaban dari kumpulan data asli untuk berisi bidang instruksi, input dan output sesuai dengan [format Alpaca] (https://github.com/hiyouga/LLaMA-Factory/tree/main/data#alpaca-format).
Alpaca adalah format JSON untuk mewakili instruksi, input pengguna, dan output sistem seperti:
{
"instruction": "user instruction (required)",
"input": "user input (optional)",
"output": "model response (required)",
"system": "system prompt (optional)",
}
Karena MedReason tidak diformat dalam Alpaca, Anda akan membuat kumpulan data Alpaca di sel berikutnya:
!mkdir -p data
# Format Med Dataset to Alpaca Format
formatted_data = [
{
"instruction": row["question"] + str(row["options"]),
"input": "",
"output": row["answer"]
}
for _, row in training.iterrows()
]
# output formatted MedReason dataset
with open("data/med.json", "w", encoding="utf-8") as f:
json.dump(formatted_data, f, indent=2, ensure_ascii=False)
Llama Factory menggunakan file tertentu untuk memahami cara memuat dataset untuk pelatihan. File ini harus ada di jalur data/dataset_info.json. Dengan demikian, kita harus membuat dataset_info.json file yang menyertakan jalur ke dataset medis berformat baru yang kami buat untuk Llama Factory CLI untuk mengakses kumpulan data. Untuk detail tentang dataset_info.json file lihat dokumentasi. Di dalam repositori Pabrik Llama ada kumpulan data yang tersedia untuk digunakan, namun, karena kami menggunakan kumpulan data khusus kami sendiri, kami harus menambahkan dataset kami ke file JSON.
# "med" will be the identifier for the dataset
# which points to the local file that contains the dataset
dataset_info = {
"med": {
"file_name": "med.json",
}
}
# Create dataset_info.json with legal dataset so can reference with llama factory
with open("data/dataset_info.json", "w", encoding="utf-8") as f:
json.dump(dataset_info, f, indent=2, ensure_ascii=False)
Sekarang objek JSON berformat Alpaca telah disimpan ke lingkungan, Anda siap untuk memulai pelatihan.
Langkah selanjutnya adalah mengatur konfigurasi pelatihan dan kemudian menulis konfigurasi ke file YAML yang digunakan LLAMA-factory untuk menjalankan pelatihan.
Sekarang Anda akan menjalankan penyempurnaan diawasi (SFT) pada bagian kumpulan data MedReason. LLaMa Factory mendukung beberapa jenis pelatihan yang berbeda. Beberapa yang paling umum digunakan adalah:
Prapelatihan: Di mana sebuah model menjalani pelatihan awal dengan menggunakan kumpulan data yang luas untuk menghasilkan respons terhadap bahasa dan ide dasar.
Penyempurnaan diawasi (SFT): Di mana model menerima pelatihan tambahan dengan data beranotasi untuk meningkatkan presisi untuk fungsi atau topik tertentu.
Pemodelan imbalan: Di mana model memperoleh pengetahuan tentang cara mencapai insentif atau imbalan tertentu yang akan menginformasikan output tentang optimasi kebijakan proksimal output (PPO).
Pelatihan: Teknik pembelajaran penguatan (RL) di mana model diasah lebih lanjut melalui teknik gradien kebijakan untuk meningkatkan efektivitasnya dalam situasi tertentu.
Ada banyak pengaturan yang digunakan dalam mengonfigurasi LoRA, tetapi beberapa yang paling penting dan umum digunakan adalah:
Laju pembelajaran (LR):** Laju pembelajaran menentukan seberapa signifikan setiap parameter model diperbarui selama setiap iterasi pelatihan. LR yang lebih tinggi dapat mempercepat konvergensi dengan memungkinkan pembaruan yang lebih besar, tetapi berisiko melampaui solusi optimal atau berosilasi di sekitarnya. LR yang lebih rendah menyebabkan konvergensi yang lebih lambat tetapi lebih stabil, mengurangi risiko ketidakstabilan di dekat solusi optimal.
loraplus_lr_ratio: Langkah ini menetapkan rasio tingkat pembelajaran. Pada umumnya rasio harus > 1, tetapi pilihan optimal loraplus_lr_ratio bergantung pada model dan tugas. Sebagai pedoman, loraplus_lr_ratio harus lebih besar ketika tugas lebih sulit dan model perlu memperbarui fitur-fiturnya untuk belajar dengan baik. Dalam hal ini, akan sangat membantu untuk membuat laju pembelajaran sedikit lebih kecil (misalnya, dengan faktor 2) daripada laju pembelajaran LoRA pada umumnya.
Ukuran batch yang efektif**: Mengonfigurasi ukuran batch dengan benar penting untuk menyeimbangkan stabilitas pelatihan dengan batasan VRAM GPU yang Anda gunakan. Ukuran batch efektif diatur oleh produk per_device_train_batch_size\ * gradient_accumulation_steps. Ukuran batch efektif yang lebih besar umumnya menghasilkan pelatihan yang lebih lancar dan stabil, tetapi mungkin juga membutuhkan lebih banyak VRAM daripada yang dimiliki GPU Anda. Ukuran batch efektif yang lebih kecil mungkin menyebabkan lebih banyak varians.
Berikut kode yang mengkonfigurasi pelatihan:
# setup training configurations
args = dict(
stage="sft", # do supervised fine-tuning
do_train=True, # we're actually training
model_name_or_path="ibm-granite/granite-3.3-2b-instruct", # use IBM Granite 3.3 2b instruct model
dataset="med", # use medical datasets we created
template="granite3", # use granite3 prompt template
finetuning_type="lora", # use LoRA adapters to save memory
lora_target="all", # attach LoRA adapters to all linear layers
loraplus_lr_ratio=16.0, # use LoRA+ algorithm with lambda=16.0
output_dir="granite3_lora", # the path to save LoRA adapters
per_device_train_batch_size=4, # the batch size
gradient_accumulation_steps=2, # the gradient accumulation steps
learning_rate=1e-4, # the learning rate
num_train_epochs=3.0, # the epochs of training
max_samples=500, # use 500 examples in each dataset
fp16=True, # use float16 mixed precision training
report_to="none", # disable wandb logging
)
# create training config file to run with llama factory
with open("train_granite3_lora_med.yaml", "w", encoding="utf-8") as file:
yaml.dump(args, file, indent=2)
Sel berikutnya akan melatih model dan dapat memakan waktu hingga 10 menit untuk dijalankan:
!llamafactory-cli train train_granite3_lora_med.yaml;
Selanjutnya, Anda akan membuat dua metode untuk mengunggah dan mengunduh data dari IBM Cloud Object Storage:
from ibm_botocore.client import Config
import ibm_boto3
def upload_file_cos(credentials, local_file_name, key):
cos = ibm_boto3.client(service_name='s3',
ibm_api_key_id=credentials['IBM_API_KEY_ID'],
ibm_service_instance_id=credentials['IAM_SERVICE_ID'],
ibm_auth_endpoint=credentials['IBM_AUTH_ENDPOINT'],
config=Config(signature_version='oauth'),
endpoint_url=credentials['ENDPOINT'])
try:
res=cos.upload_file(Filename=local_file_name, Bucket=credentials['BUCKET'],Key=key)
except Exception as e:
print(Exception, e)
else:
print(' File Uploaded')
def download_file_cos(credentials,local_file_name,key):
cos = ibm_boto3.client(service_name='s3',
ibm_api_key_id=credentials['IBM_API_KEY_ID'],
ibm_service_instance_id=credentials['IAM_SERVICE_ID'],
ibm_auth_endpoint=credentials['IBM_AUTH_ENDPOINT'],
config=Config(signature_version='oauth'),
endpoint_url=credentials['ENDPOINT'])
try:
res=cos.download_file(Bucket=credentials['BUCKET'],Key=key,Filename=local_file_name)
except Exception as e:
print(Exception, e)
else:
print('File Downloaded')
Sel berikutnya berisi kredenSIAL Cloud Object Storage.
Di buku catatan Anda, klik tab Cuplikan Kode di sudut kanan. Langkah ini membuka menu dengan beberapa opsi untuk cuplikan kode yang dihasilkan. Pilih "Baca Data":
Langkah ini akan membuka menu untuk memilih file data. Jika Anda belum mengunggah apa pun ke instans Cloud Object Storage, Anda harus mengunggah sesuatu untuk menghasilkan kredensial dan itu bisa berupa kumpulan data klasik seperti wine.csv.
Setelah mengklik "Pilih", Anda sekarang dapat membuat cuplikan kredensial di bawah opsi "Muat sebagai". Pilih "Sisipkan kode ke sel":
Langkah ini menghasilkan sel seperti berikut ini dengan kredensial yang berisi ID dan titik akhir yang benar yang dihasilkan:
# @hidden_cell
# The following code contains metadata for a file in your project storage.
# You might want to remove secret properties before you share your notebook.
storage_metadata = {
'IAM_SERVICE_ID': '',
'IBM_API_KEY_ID': '',
'ENDPOINT': '',
'IBM_AUTH_ENDPOINT': '',
'BUCKET': '',
'FILE': ''
}
Sekarang folder zip yang berisi adaptor dan informasi tentang adaptor itu sendiri:
!zip -r "granite3_lora.zip" "granite3_lora"
Periksa apakah Anda telah membuat zip dengan benar:
!ls
Sekarang saatnya menjalankan inferensi. Inferensi akan didukung oleh generasi HuggingFace, yang menyediakan model.generate () metode untuk pembuatan teks dengan menggunakan PyTorch.
Tutorial ini menunjukkan menanyakan model dasar pertanyaan medis yang ditarik dari kumpulan data MedReason. Masuk akal bahwa model dasar mungkin tidak dapat menjawab pertanyaan ini karena ini adalah model tujuan umum yang dilatih pada kumpulan data yang besar dan beragam.
Pertama, atur konfigurasi inferensi:
# setup inference configurations
args = dict(
model_name_or_path="ibm-granite/granite-3.3-2b-instruct", # use IBM Granite 3.3 2b instruct model
template="granite3", # set to the same one used in training, template for constructing prompts
infer_backend="huggingface" # choices: [huggingface, vllm]
)
# create inference config file to run with llama factory
with open("inference_config.yaml", "w", encoding="utf-8") as file:
yaml.dump(args, file, indent=2)
Sekarang Anda akan mengajukan chatbot salah satu pertanyaan dari kumpulan data MedReason:
from llamafactory.chat import ChatModel
chat_model = ChatModel(args)
messages = []
# run inference chatbot
question = '''
A 1-year-old girl is brought to a neurologist due to increasing seizure frequency over the past 2 months.
She recently underwent a neurology evaluation which revealed hypsarrhythmia on electroencephalography (EEG) with a mix of slow waves, multifocal spikes, and asynchrony.
Her parents have noticed the patient occasionally stiffens and spreads her arms at home. She was born at 38-weeks gestational age without complications.
She has no other medical problems. Her medications consist of lamotrigine and valproic acid. Her temperature is 98.3\u00b0F (36.8\u00b0C), blood pressure is 90/75 mmHg, pulse is 94/min, and respirations are 22/min.
Physical exam reveals innumerable hypopigmented macules on the skin and an irregularly shaped, thickened, and elevated plaque on the lower back.
Which of the following is most strongly associated with this patient's condition?"
"A": "Cardiac rhabdomyoma", "B": "Glaucoma", "C": "Optic glioma", "D": "Polyostotic fibrous dysplasia"
'''
Buat pesan baru menggunakan pertanyaan dan berikan ke model dasar:
messages.append({"role": "user", "content": question})
response = ""
for new_text in chat_model.stream_chat(messages):
response += new_text
print(response)
messages.append({"role": "assistant", "content": response})
Berikut contoh output dari model dasar Granite 3.3:
Pengguna:
A 1-year-old girl is brought to a neurologist due to increasing seizure frequency over the past 2 months.
She recently underwent a neurology evaluation which revealed hypsarrhythmia on electroencephalography (EEG) with a mix of slow waves, multifocal spikes, and asynchrony.
Her parents have noticed the patient occasionally stiffens and spreads her arms at home. She was born at 38-weeks gestational age without complications.
She has no other medical problems. Her medications consist of lamotrigine and valproic acid. Her temperature is 98.3\F (36.8\C), blood pressure is 90/75 mmHg, pulse is 94/min, and respirations are 22/min.
Physical exam reveals innumerable hypopigmented macules on the skin and an irregularly shaped, thickened, and elevated plaque on the lower back.
Which of the following is most strongly associated with this patient's condition?"
"A": "Cardiac rhabdomyoma", "B": "Glaucoma", "C": "Optic glioma", "D": "Polyostotic fibrous dysplasia"
Tanggapan:
The most strongly associated condition with this patient's condition is "C": "Optic glioma".
The patient's symptoms of hypsarrhythmia on EEG, seizure frequency increase, and the presence of hypopigmented macules and a thickened plaque on the lower back are indicative of a neurological disorder. Optic glioma is a type of brain tumor that can present with these symptoms, including seizures and visual disturbances.
Option A, "Cardiac rhabdomyoma", typically presents with cardiac involvement and is not associated with the described EEG findings or skin manifestations.
Option B, "Glaucoma", is an eye disease that can lead to vision loss but is not associated with the EEG findings or skin lesions described.
Option D, "Polyostotic fibrous dysplasia", is a bone disorder characterized by multiple bone lesions and is not associated with the neurological symptoms and EEG findings presented.
Therefore, based on the clinical presentation, the most likely diagnosis is an optic glioma.
Respons yang benar dari kumpulan data adalah:
answer: Cardiac rhabdomyoma
Jadi model dasar tidak menghasilkan jawaban yang benar.
Kami membandingkan Hasil dengan menjalankan dengan model dasar dan adaptor yang disetel LoRa. Kami kemudian mengajukan pertanyaan yang sama untuk melihat bagaimana penyetelan dengan kumpulan data hukum memungkinkan model untuk lebih memahami dan menjawab pertanyaan medis.
Sel berikut tidak akan diperlukan jika Anda telah melakukan LoRa di sesi yang sama. Namun, jika Anda kembali ke Jupyter Notebook dan tidak ingin melatih ulang, Anda dapat mengunduh adaptor yang disetel dengan baik dari Instans COS Anda.
download_file_cos(credentials, "granite3_lora.zip", "granite3_lora.zip")
!unzip granite3_lora.zip
Sekarang Anda akan mengkonfigurasi opsi untuk ChatModel sehingga akan menggabungkan adaptor.
# setup inference configurations
args = dict(
model_name_or_path="ibm-granite/granite-3.3-2b-instruct", # use IBM Granite 3.3 2b instruct model
adapter_name_or_path="granite3_lora", # load the saved LoRA adapters
template="granite3", # set to the same one used in training, template for constructing prompts
finetuning_type="lora", # which fine-tuning technique used in training
infer_backend="huggingface" # choices: [huggingface, vllm]
)
# create inference config file to run with llama factory
with open("inference_config.yaml", "w", encoding="utf-8") as file:
yaml.dump(args, file, indent=2)
from llamafactory.chat import ChatModel
chat_model = ChatModel(args)
Sekarang kita dapat menguji tantangan penalaran yang sama dengan model yang disetel dengan baik:
messages = []
# run inference chatbot
question = '''
A 1-year-old girl is brought to a neurologist due to increasing seizure frequency over the past 2 months.
She recently underwent a neurology evaluation which revealed hypsarrhythmia on electroencephalography (EEG) with a mix of slow waves, multifocal spikes, and asynchrony.
Her parents have noticed the patient occasionally stiffens and spreads her arms at home. She was born at 38-weeks gestational age without complications.
She has no other medical problems. Her medications consist of lamotrigine and valproic acid. Her temperature is 98.3\u00b0F (36.8\u00b0C), blood pressure is 90/75 mmHg, pulse is 94/min, and respirations are 22/min.
Physical exam reveals innumerable hypopigmented macules on the skin and an irregularly shaped, thickened, and elevated plaque on the lower back.
Which of the following is most strongly associated with this patient's condition?"
"A": "Cardiac rhabdomyoma", "B": "Glaucoma", "C": "Optic glioma", "D": "Polyostotic fibrous dysplasia"
'''
Buat pesan baru menggunakan pertanyaan dan meneruskannya ke model yang disetel dengan baik:
messages.append({"role": "user", "content": question})
response = ""
for new_text in chat_model.stream_chat(messages):
response += new_text
print(response)
messages.append({"role": "assistant", "content": response})
Cardiac rhabdomyoma
Pengguna:
A 1-year-old girl is brought to a neurologist due to increasing seizure frequency over the past 2 months.
She recently underwent a neurology evaluation which revealed hypsarrhythmia on electroencephalography (EEG) with a mix of slow waves, multifocal spikes, and asynchrony.
Her parents have noticed the patient occasionally stiffens and spreads her arms at home. She was born at 38-weeks gestational age without complications.
She has no other medical problems. Her medications consist of lamotrigine and valproic acid. Her temperature is 98.3\u00b0F (36.8\u00b0C), blood pressure is 90/75 mmHg, pulse is 94/min, and respirations are 22/min.
Physical exam reveals innumerable hypopigmented macules on the skin and an irregularly shaped, thickened, and elevated plaque on the lower back.
Which of the following is most strongly associated with this patient's condition?"
"A": "Cardiac rhabdomyoma", "B": "Glaucoma", "C": "Optic glioma", "D": "Polyostotic fibrous dysplasia"
Tanggapan:
Cardiac rhabdomyoma
Kali ini model menghasilkan jawaban yang benar, berkat adaptor yang terlatih.
Satu aspek yang perlu diperhatikan, model tidak lagi merespons dengan alasannya. Hasil ini karena kumpulan data yang digunakan untuk LoRA hanya memiliki jawaban yang benar sebagai output model yang diharapkan. Fine-tuning LoRa dapat digunakan untuk memberikan informasi baru tetapi juga untuk menginstruksikan model bagaimana merespons.
Dalam tutorial ini Anda menggunakan LoRa untuk menyempurnakan model IBM Granite-3.3-2B-Instruct dengan pengetahuan medis baru dan templat terperinci tentang cara merespons. Anda melihat kapasitas Granite 3.3 untuk belajar bahkan dengan model kecil dan sampel terbatas dari kumpulan data.
Jelajahi pustaka model dasar IBM di portfolio watsonx untuk menskalakan AI generatif untuk bisnis Anda dengan percaya diri.
Gunakan AI di bisnis Anda dengan keahlian AI terdepan di industri dan portofolio solusi dari IBM.
Rancang ulang alur kerja dan operasi yang penting dengan menambahkan AI untuk memaksimalkan pengalaman, pengambilan keputusan secara real-time, dan nilai bisnis.