42 điểm bởi xguru 2025-02-03 | 5 bình luận | Chia sẻ qua WhatsApp
  • 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 FluxPieter 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_id vào
  • 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
  • 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

 
cladio 2025-02-04

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...

 
botplaysdice 2025-02-04

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'.

 
sollscherr 2025-02-03

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é.

 
xguru 2025-02-03

Một bình luận trên Hacker News khá gây chú ý

  • Tôi đã thử làm thế này cho con mèo đã mất mà tôi rất yêu quý. Tôi khá hài lòng với kết quả, nhưng đến một lúc nào đó tôi bỗng thấy rợn người về chính việc mình đang làm
    • Có vẻ đây sẽ là một mảng kinh doanh lớn. Có lẽ tôi đã gửi hàng trăm nghìn email, tin nhắn và đoạn chat, nên hoàn toàn có thể huấn luyện trên kho dữ liệu giao tiếp của một người thân yêu để sau khi họ qua đời vẫn có thể trò chuyện với 'họ'
    • Sau khi cha tôi qua đời, tôi đã làm việc này bằng giọng nói của ông, rồi thiết lập khả năng trò chuyện với một trợ lý hỗ trợ LLM để nó trả lời bằng giọng nói và cách nói của cha tôi. Đó là giai đoạn tôi đối diện và đau buồn theo một cách rất kỳ lạ, và cuối cùng tôi cảm thấy điều mình đang làm thật sự rất kỳ quặc
    • Cái này khá giống tập "Be Right Back" của Black Mirror

Cũng có một bình luận mang tính thông tin

  • Với Flux, bộ mã hóa văn bản có nhiều tính năng hơn hẳn và có thể viết prompt bằng những câu có ý nghĩa, đầy đủ hơn
    • Vì vậy có thể bớt dùng kiểu cụm từ ngắn gọn phân tách bằng dấu phẩy thường thấy ở Stable Diffusion
  • Ngoài ra cũng nên làm điều tương tự với ảnh dùng để huấn luyện. Sẽ tốt hơn nếu gắn caption cho mọi thứ mà bạn không muốn mô hình ghi nhớ là 'tôi' (việc đang làm, quần áo đang mặc, người đi cùng, phụ kiện, v.v.)
 
humblebee 2025-02-03

"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 😳