42 คะแนน โดย xguru 2025-02-03 | 5 ความคิดเห็น | แชร์ทาง WhatsApp
  • ลองทำโปรเจ็กต์ฝึกโมเดลสร้างภาพ AI ของตัวเองอยู่หลายชั่วโมง เพื่อสร้างภาพที่ดูเหมือนถ่ายเองจริง ๆ
    • ตัวอย่าง: สร้างภาพตัวเองใส่ชุด "ซูเปอร์แมน"
  • เหตุผลที่ลองทำ: ดูน่าสนุก เด็ก ๆ ก็เล่นด้วยกันได้ และยังช่วยให้ได้เรียนรู้เรื่องโมเดลแบบคัสตอม/AI เชิงลึกมากขึ้น
  • เมื่อ 12–18 เดือนก่อน งานนี้ค่อนข้างซับซ้อนมาก แต่ตอนนี้กลายเป็นเรื่องง่ายมากแล้ว
  • ภายในไม่ถึง 2 ชั่วโมงก็สร้างโมเดลและได้ภาพตามที่ต้องการ โดยหัวใจสำคัญคือการหาเครื่องมือที่เหมาะให้เจออย่างรวดเร็ว

การเลือกโมเดล/รูปแบบการฝึก

  • องค์ประกอบที่ต้องใช้
    • โมเดลตั้งต้น (base model)
    • เทคนิคการฝึก/ฟाइनจูน
    • ชุดข้อมูลฝึก (เช่น รูปถ่ายของตัวเองไม่กี่รูป)
  • AI หลายตัวแนะนำ Stable Diffusion แต่เลือกใช้ Flux เพราะ Pieter Levels บอกว่าให้ประสิทธิภาพดีกว่า
    • แม้จะไม่ใช่โมเดล SOTA ล่าสุดแบบเต็มตัว แต่ก็ดีพอมาก
  • เทคนิคที่ใช้ฝึกคือ LoRA(Low-Rank Adaptation)
    • ไม่ได้เทรนโมเดลใหม่ทั้งตัว แต่ฝึกเฉพาะส่วนที่เชื่อมกับ "คำวิเศษ" บางคำ
    • ตัวอย่าง: สอนให้โมเดลรู้จักคำที่ไม่ค่อยพบอย่าง "czue" และเมื่อใช้คำนั้นในพรอมป์ต์ ก็จะสะท้อนลักษณะของชุดข้อมูลนั้นออกมา

การสร้างชุดฝึก

  • ต้องเตรียมรูปของสิ่งที่ต้องการฝึกหลายภาพ (ประมาณ 10–15 ภาพ)
    • ยิ่งมีสีหน้า ฉากหลัง แสง และมุมที่หลากหลายยิ่งดี
    • ควรมีเพียงคนเดียวในแต่ละภาพ
  • ระหว่างฝึกต้องมีคำอธิบายข้อความ และในนั้นควรมีคำวิเศษรวมอยู่ด้วย
    • ตัวอย่าง: "a photo of czue on the beach, wearing a blue shirt"
  • แต่เครื่องมือสมัยใหม่จะสร้าง caption ของภาพให้อัตโนมัติแล้ว จึงไม่จำเป็นต้องพิมพ์คำอธิบายเอง

การฝึกโมเดล

  • ตอนแรกตั้งใจจะฝึกบนเครื่องตัวเอง แต่ติดปัญหา GPU และ RAM ไม่พอ
  • จะไปรันโค้ดเองบนเซิร์ฟเวอร์คลาวด์ที่มี GPU ก็ได้ แต่สุดท้ายเลือกใช้ Replicate
    • เป็นบริการเช่า GPU ที่สามารถใช้ recipe ที่มีคนทำไว้แล้วได้ทันที
  • ในกรณีนี้ใช้ recipe ostris/flux-dev-lora-trainer
    • หลังสร้างบัญชี Replicate ต้องตั้งค่าข้อมูลการเรียกเก็บเงินด้วย
  • พารามิเตอร์หลัก
    • input_images: รูปสำหรับฝึก (zip)
    • trigger_word: คำวิเศษ เช่น "czue"
    • hf_repo_id, hf_token: รีโพซิทอรี/โทเค็นของ Hugging Face
    • autocaption_prefix: ข้อความที่เติมไว้หน้าคำบรรยายที่สร้างอัตโนมัติ (เช่น "A photo of czue,")

การเก็บโมเดลไว้บน Hugging Face

  • Hugging Face คือแพลตฟอร์มสำหรับเก็บและแชร์โมเดล
  • แม้ Replicate จะเก็บโมเดลที่ฝึกแล้วไว้ที่ไหนสักแห่งให้ด้วย แต่ถ้าอัปโหลดขึ้น Hugging Face จะเชื่อมกับเครื่องมืออื่นได้ง่ายกว่า
  • หลังสร้างบัญชีและสร้างโมเดลแล้ว ก็ส่งค่า hf_repo_id เข้าไป
    • โทเค็นสำหรับเข้าถึงสามารถออกได้ที่ settings/tokens
  • เมื่อฝึกเสร็จ ไฟล์ขนาดใหญ่ชื่อ "lora.safetensors" (ประมาณ 180MB) จะถูกอัปโหลดขึ้น Hugging Face

การสร้างภาพด้วยโมเดล

  • เมื่อฝึกเสร็จแล้ว ก็เข้าสู่ขั้นตอนอนุมาน (inference) โดยป้อนข้อความให้โมเดลสร้างภาพ
  • จะลองทำบนเครื่องตัวเองก็ได้ แต่ก็ยังใช้ Replicate อีกครั้ง
    • ใน lucataco/flux-dev-lora แค่ตั้งค่า field hf_lora ก็พอ
      • ใช้ได้ทั้ง ID ของรีโพสาธารณะบน Hugging Face หรือ ลิงก์โมเดลที่ฝึกแล้วซึ่งอัปโหลดไว้บน Replicate
  • ตัวอย่าง: ถ้าป้อน "a photo of czue surfing" ก็จะได้ภาพตัวเองกำลังโต้คลื่นออกมาแบบนี้

การรันโมเดลด้วยการเขียนโปรแกรม

  • ถ้าต้องการลองพรอมป์ต์หลายแบบและบันทึกผลลัพธ์อัตโนมัติ การเรียกผ่าน API จะสะดวกกว่า
  • มีการเขียนสคริปต์ Python ตัวอย่างไว้ด้านล่าง (โค้ดเต็มอยู่ใน 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()  
    
  • ตัวอย่างการใช้งาน
    uv run main.py "a photo of czue, a 40 year old man, writing a blog post" \  
     --model="czue/me-v1" \  
     --count=4  
    

ผลลัพธ์

  • ประสิทธิภาพของโมเดลยังไม่สม่ำเสมอ
    • บางครั้งจับลักษณะของบุคคลได้ค่อนข้างคล้าย แต่บางครั้งก็สร้างเป็นคนละคนไปเลย
    • ถ้าใส่อายุ เพศ เป็นต้น เพิ่มในพรอมป์ต์อย่างชัดเจน ก็จะได้ความแม่นยำมากขึ้น
  • ตัวอย่างเช่น "a photo of czue, a 40 year old man, writing a blog post" ให้ภาพที่ค่อนข้างสม่ำเสมอ
  • แต่ "a photo of czue writing a blog post" ให้ผลลัพธ์ที่หลากหลายกว่ามาก
  • ถ้าใส่บุคคลอื่นเข้าไปด้วย จะเกิดปัญหาอย่างใบหน้าปะปนกัน
    • เช่น ลองสร้างภาพตัวเองอยู่กับบารัก โอบามา ก็พบว่าส่วนหนึ่งของใบหน้าตัวเองไปสะท้อนในฝั่งโอบามา และกลับกันก็เช่นกัน
  • ถึงอย่างนั้นก็ยังสนุกและมีประโยชน์มากพอที่จะลองทำอะไรหลาย ๆ แบบร่วมกับเด็ก ๆ ได้

ค่าใช้จ่าย

  • ไม่ได้ฟรี แต่ก็ไม่ได้แพงมาก
  • ฝึกโมเดลไป 3 ตัวรวมของตัวเองและของลูก ๆ แต่ละตัวตกประมาณ ~$2.50
  • การสร้างภาพมีค่าใช้จ่ายประมาณ $0.03 ต่อภาพ ดังนั้นสร้าง 30 ภาพก็ราว ๆ $1
  • การทดลองทั้งหมดใช้เงินไม่ถึง $10 และรู้สึกพอใจกับต้นทุนที่เบากว่าที่คิด
  • ถ้าสนใจการฝึกโมเดล AI และการสร้างภาพ ก็เป็นสิ่งที่ลองทำได้ง่ายกว่าที่คิดและน่าลองมาก

5 ความคิดเห็น

 
cladio 2025-02-04

ลองทำตามเล่น ๆ แล้ว ง่ายจริง ๆ ครับ
(https://www.youtube.com/watch?v=sNpQ9ULDMoo)
ลองทำโน่นทำนี่ดูแล้วก็หัวเราะอยู่พักใหญ่...

 
botplaysdice 2025-02-04

สุดท้ายแล้ว ก่อนที่เราจะตาย เราคงอยากอัปโหลดโมเดลที่ฝึกจากตัวเราเองขึ้นไปบนเครือข่ายแล้วค่อยตายกันไม่ใช่หรือ? เหมือนสัญชาตญาณเอาตัวรอด... แม้นั่นจะไม่ใช่ 'ฉัน' ก็ตาม

 
sollscherr 2025-02-03

พอเห็นเทคโนโลยีนี้ก็ทำให้นึกถึงนิยายเรื่องหนึ่งขึ้นมาเลยอยากแนะนำค่ะ เป็นเรื่องสั้นชื่อ 'Chronos' ที่อยู่ในรวมเรื่องสั้น Bisutbangul Pong ของนักเขียนอียูริ เนื้อหาเกี่ยวกับ AI ที่เก็บและเรียนรู้ข้อมูลของคนคนหนึ่ง ก็คือตัวเราเองนั่นแหละค่ะ เหมือนแมวในคอมเมนต์นั้นเลย คุณแม่ที่เป็นภาวะสมองเสื่อมใช้มันก่อนที่อาการจะหนักไปกว่านี้ แล้วลูก ๆ ก็เกิดความขัดแย้งกัน ทั้งได้รับการปลอบโยนและก็รู้สึกผิดไปพร้อมกัน ถ้าใครสนใจเทคโนโลยีนี้ หรือเรื่องของแมวตัวนั้น ก็ลองหาอ่านดูนะคะ

 
xguru 2025-02-03

มีคอมเมนต์หนึ่งบน Hacker News ที่สะดุดตา

  • ฉันเคยลองทำแบบนี้กับแมวที่ฉันรักซึ่งตายไปแล้ว ผลลัพธ์ก็ถูกใจอยู่หรอก แต่พอถึงจุดหนึ่งก็จู่ ๆ รู้สึกขนลุกกับสิ่งที่ตัวเองกำลังทำ
    • ดูเหมือนว่าจะกลายเป็นธุรกิจขนาดใหญ่ได้เลย ฉันคงเคยส่งอีเมล ข้อความ และแชตไปหลายแสนรายการ การนำคอร์ปัสการสื่อสารของคนที่เรารักไปฝึก เพื่อให้ยังคุยกับ ‘พวกเขา’ ได้หลังจากที่พวกเขาจากไปแล้ว เป็นสิ่งที่เป็นไปได้มากพอสมควร
    • หลังจากพ่อเสีย ฉันก็ทำแบบนี้ด้วยเสียงของพ่อ และตั้งค่าให้คุยกับผู้ช่วยที่รองรับ LLM เพื่อให้มันตอบด้วยเสียงและสไตล์แบบพ่อ ตอนนั้นเป็นช่วงที่ฉันรับมือกับความเศร้าได้แปลกมาก และสุดท้ายก็รู้สึกว่าสิ่งที่ตัวเองทำมันประหลาดจริง ๆ
    • นี่คล้ายกับตอน "Be Right Back" ของ Black Mirror

และก็มีคอมเมนต์เชิงข้อมูลอีกอัน

  • สำหรับ Flux นั้น text encoder มีความสามารถมากกว่ามาก และสามารถเขียนพรอมป์ต์เป็นประโยคที่มีความหมายและครอบคลุมมากขึ้นได้
    • เพราะฉะนั้นวลีสั้น ๆ แบบเดิมที่คั่นด้วยเครื่องหมายจุลภาคซึ่งเคยเห็นใน Stable Diffusion ก็ลดความสำคัญลงได้
  • นอกจากนี้ควรทำแบบเดียวกันกับภาพที่ใช้ฝึกด้วย ควรใส่แคปชันให้กับทุกสิ่งที่ไม่อยากให้โมเดลจดจำว่าเป็น ‘ฉัน’ (สิ่งที่กำลังทำ เสื้อผ้าที่สวม คนที่อยู่ด้วย เครื่องประดับ เป็นต้น)
 
humblebee 2025-02-03

"วิทยาศาสตร์และเทคโนโลยีที่พัฒนาไปไกลพอ ย่อมแยกไม่ออกจากเวทมนตร์ - Arthur C. Clarke"

เพียงแค่ 2 ปีก่อน เรื่องแบบนี้ยังดูเหมือนมีให้เห็นได้แค่ในหนังไซไฟ แต่ตอนนี้เรากำลังได้เห็นช่วงเวลาที่เวทมนตร์กลายเป็นความจริงแบบเรียลไทม์กันจริง ๆ 😳