- Tôi đã thử một dự án huấn luyện mô hình ảnh AI của riêng mình trong vài giờ để tạo ra những bức ảnh trông như thể do chính tôi chụp
- Ví dụ: tạo ảnh tôi mặc đồ hóa trang thành "Superman"
- Lý do thử: nghe có vẻ vui, phù hợp để chơi cùng bọn trẻ và cũng giúp học thêm về mô hình tùy biến/phần AI nâng cao
- Cách đây 12~18 tháng, việc này khá phức tạp, nhưng giờ đã trở nên rất đơn giản
- Tôi đã tạo được mô hình và có ảnh như mong muốn trong chưa đến 2 giờ; điểm mấu chốt là nhanh chóng xác định đúng công cụ
Chọn mô hình/mẫu huấn luyện
- Các thành phần cần có
- mô hình nền tảng (base model)
- kỹ thuật huấn luyện/fine-tuning
- bộ dữ liệu huấn luyện (như vài tấm ảnh của chính bạn)
- Nhiều AI khuyến nghị Stable Diffusion, nhưng tôi chọn mô hình Flux mà Pieter Levels đã dùng vì nghe nói cho hiệu năng tốt hơn
- Dù không phải mô hình SOTA mới nhất tuyệt đối, nhưng vẫn đủ tốt
- Với kỹ thuật huấn luyện, tôi dùng LoRA(Low-Rank Adaptation)
- Thay vì huấn luyện lại toàn bộ mô hình, chỉ huấn luyện phần gắn với một "từ khóa ma thuật" cụ thể
- Ví dụ: dạy mô hình từ hiếm "czue", rồi khi dùng từ đó trong prompt, mô hình sẽ phản ánh các đặc trưng của bộ dữ liệu tương ứng
Tạo tập huấn luyện
- Cần chuẩn bị nhiều ảnh của đối tượng cần học (khoảng 10~15 ảnh)
- Càng đa dạng về biểu cảm, hậu cảnh, ánh sáng, góc chụp... càng tốt
- Tốt nhất mỗi ảnh chỉ có một người
- Khi huấn luyện cần có mô tả văn bản, và trong đó phải chứa từ khóa ma thuật
- Ví dụ: "a photo of czue on the beach, wearing a blue shirt"
- Nhưng các công cụ gần đây có thể tự sinh caption cho ảnh, nên không cần tự nhập mô tả
Huấn luyện mô hình
- Ban đầu tôi định huấn luyện trên máy cục bộ, nhưng do thiếu GPU và RAM nên khó thực hiện
- Có thể tự chạy mã trên máy chủ GPU cloud, nhưng cuối cùng tôi dùng Replicate
- Đây là dịch vụ cho thuê GPU và có thể dùng ngay các recipe đã được dựng sẵn
- Trong trường hợp này, tôi dùng recipe ostris/flux-dev-lora-trainer
- Sau khi tạo tài khoản Replicate, cần thiết lập thông tin thanh toán
- Các tham số chính
- input_images: ảnh huấn luyện (zip)
- trigger_word: từ khóa ma thuật, ví dụ "czue"
- hf_repo_id, hf_token: repository/token của Hugging Face
- autocaption_prefix: cụm tiền tố gắn trước caption tự sinh (ví dụ: "A photo of czue,")
Lưu mô hình lên Hugging Face
- Hugging Face là nền tảng để lưu trữ và chia sẻ mô hình
- Replicate cũng lưu mô hình đã huấn luyện ở đâu đó, nhưng đưa lên Hugging Face thì dễ tích hợp với các công cụ khác hơn
- Sau khi tạo tài khoản và mô hình, truyền
hf_repo_idvào- Token truy cập có thể cấp tại settings/tokens
- Khi huấn luyện xong, một tệp lớn tên "lora.safetensors" (khoảng 180MB) sẽ được tải lên Hugging Face
Tạo ảnh bằng mô hình
- Khi huấn luyện xong, bước tiếp theo là chạy suy luận (inference): nhập văn bản vào mô hình để tạo ảnh
- Có thể thử trực tiếp trên máy cục bộ, nhưng tôi lại dùng Replicate
- Chỉ cần đặt trường hf_lora trong lucataco/flux-dev-lora
- ID repository Hugging Face public hoặc liên kết tới mô hình đã huấn luyện được tải lên Replicate
- Chỉ cần đặt trường hf_lora trong lucataco/flux-dev-lora
- Ví dụ: nhập "a photo of czue surfing" thì sẽ nhận được ảnh bản thân đang lướt sóng như bên dưới
Chạy mô hình theo cách lập trình
- Nếu muốn thử nhiều prompt và tự động lưu kết quả thì gọi qua API sẽ tiện hơn
- Tôi đã viết script Python ví dụ bên dưới (toàn bộ mã có trên Github)
# /// script # requires-python = ">=3.12" # dependencies = [ # "replicate", # ] # /// import argparse import os import re import replicate import uuid DEFAULT_MODEL = "czue/me-v1" DEFAULT_COUNT = 1 def get_input(prompt, model=DEFAULT_MODEL, count=DEFAULT_COUNT): return { "prompt": prompt, "hf_lora": model, "num_outputs": count } def main(): parser = argparse.ArgumentParser() parser.add_argument("prompt", help="Prompt for the photo") parser.add_argument("--model", default=DEFAULT_MODEL, help="Model to use (default: %(default)s)") parser.add_argument("--count", default=DEFAULT_COUNT, help="Number of photos to generate (default: %(default)s)", type=int) args = parser.parse_args() input = get_input(args.prompt, args.model, args.count) output = replicate.run( "lucataco/flux-dev-lora:091495765fa5ef2725a175a57b276ec30dc9d39c22d30410f2ede68a3eab66b3", input=input ) output_dir = "output" os.makedirs(output_dir, exist_ok=True) prompt_slug = "-".join(args.prompt.split(" ")[-3:]) prompt_slug = re.sub(r'[^a-zA-Z0-9\-]', '', prompt_slug).lower() for index, item in enumerate(output): file_id = uuid.uuid4().hex[:5] output_path = os.path.join(output_dir, f"{prompt_slug}-{file_id}.webp") with open(output_path, "wb") as file: file.write(item.read()) print(f"Saved photo {output_path}") if __name__ == "__main__": main() - Ví dụ cách dùng
uv run main.py "a photo of czue, a 40 year old man, writing a blog post" \ --model="czue/me-v1" \ --count=4
Kết quả
- Hiệu năng của mô hình khá thất thường
- Có lúc nắm bắt đặc điểm khuôn mặt khá giống, nhưng đôi khi lại tạo ra một người khác
- Nếu ghi rõ thêm tuổi, giới tính... trong prompt thì độ chính xác sẽ cao hơn một chút
- Ví dụ, "a photo of czue, a 40 year old man, writing a blog post" tạo ra hình ảnh tương đối nhất quán
- Trong khi đó, "a photo of czue writing a blog post" cho kết quả rời rạc hơn hẳn
- Nếu đưa thêm người khác vào cùng, sẽ phát sinh vấn đề như gương mặt bị trộn lẫn
- Tôi thử tạo ảnh đứng cùng Barack Obama thì một phần khuôn mặt của tôi bị phản ánh sang phía Obama và ngược lại
- Dù vậy, trải nghiệm này vẫn đủ vui và hữu ích để thử nhiều ý tưởng khác nhau cùng bọn trẻ
Chi phí
- Không phải miễn phí, nhưng cũng không quá đắt
- Tôi đã huấn luyện 3 mô hình cho mình và các con, mỗi mô hình khoảng ~$2.50
- Tạo ảnh tốn khoảng $0.03 mỗi tấm, nên tạo 30 ảnh cũng chỉ vào khoảng $1
- Cả thử nghiệm tiêu tốn dưới $10, và tôi khá hài lòng vì chi phí thấp hơn mong đợi
- Nếu bạn quan tâm đến việc huấn luyện mô hình AI và tạo ảnh, đây là thứ dễ thử hơn bạn nghĩ và rất đáng để bắt tay vào làm
5 bình luận
Tò mò nên tôi làm thử theo, và đúng là rất dễ.
(https://www.youtube.com/watch?v=sNpQ9ULDMoo)
Tôi đã thử làm đủ thứ và cười một lúc lâu...
Cuối cùng, chẳng phải trước khi chết chúng ta sẽ muốn tải lên mạng một mô hình được huấn luyện giống như chính mình rồi mới chết sao? Giống như bản năng sinh tồn vậy... dù đó không phải là 'tôi'.
Nhìn công nghệ này khiến tôi nhớ đến một cuốn tiểu thuyết nên muốn giới thiệu. Đó là truyện ngắn "Chronos" trong tập truyện Bisutbangul Pong của nhà văn Lee Yuri. Nội dung nói về AI lưu trữ và học từ dữ liệu của một con người, tức là về chính người đó. Giống như chú mèo trong bình luận kia vậy. Người mẹ mắc chứng mất trí nhớ đã dùng nó trước khi triệu chứng trở nặng hơn. Rồi những người con nảy sinh mâu thuẫn. Họ vừa được an ủi, vừa cảm thấy tội lỗi. Nếu bạn quan tâm đến công nghệ này, và cả câu chuyện về chú mèo kia, hãy thử đọc một lần nhé.
Một bình luận trên Hacker News khá gây chú ý
Cũng có một bình luận mang tính thông tin
"Bất kỳ công nghệ nào đủ tiên tiến đều không thể phân biệt với phép thuật - Arthur C. Clarke"
Mới chỉ 2 năm trước thôi, đây còn là chuyện tưởng như chỉ thấy trong phim khoa học viễn tưởng, vậy mà giờ chúng ta đang thực sự chứng kiến khoảnh khắc phép thuật trở thành hiện thực theo thời gian thực 😳