เบนช์มาร์ก Whisper: Nvidia RTX 4090 เทียบกับ M1 Pro MLX
(owehrens.com)- รันโมเดล Whisper large ด้วย เฟรมเวิร์ก MLX สำหรับ Apple Silicon เพื่อเปรียบเทียบช่องว่างระหว่างแล็ปท็อปกับ GPU ประสิทธิภาพสูงในการถอดเสียงไฟล์เสียง 10 นาที
- ในเงื่อนไขพื้นฐาน MacBook M1 Pro ใช้เวลา 216 วินาที, ส่วน RTX 4090 ใช้ 186 วินาที ทำให้ RTX 4090 เร็วกว่าอยู่ราว 30 วินาที หรือประมาณ 16%
- เมื่อใช้ insanely-fast-whisper บน RTX 4090 การถอดเสียงด้วย whisper-large-v3 ลดเหลือเพียง 8 วินาที แสดงให้เห็นว่าการปรับแต่งโมเดลและอิมพลีเมนเทชันสามารถเปลี่ยนผลการเปรียบเทียบฮาร์ดแวร์ได้มาก
- การรันบน macOS ผ่าน MPS ใช้เวลา 4 นาที 23 วินาที และ M2 Ultra 76 GPU core กับ M3 Max 40 GPU core ต่างก็เร็วกว่า M1 มาก โดยมีความเร็วใกล้เคียงกัน
- การใช้พลังงานเพิ่มขึ้นคือ PC ที่ใช้ RTX 4090 เพิ่ม +242W จากสถานะว่าง ขณะที่ MacBook M1 Pro เพิ่ม +38W และผลทั้งหมดนี้ไม่ใช่เบนช์มาร์กที่แม่นยำแบบเข้มงวด แต่เป็นการเปรียบเทียบเพื่อดูภาพรวมประสิทธิภาพของ MLX
รันเบนช์มาร์ก Whisper ด้วย MLX
- Apple เปิดตัวเฟรมเวิร์กแมชชีนเลิร์นนิง MLX สำหรับ Apple Silicon และใช้ตัวอย่าง Whisper ที่ให้มาด้วยในการทดสอบเบนช์มาร์ก
- มีการเพิ่มไฟล์ใหม่เข้าไปในคลังเก็บเบนช์มาร์ก Whisper เดิม แล้วถอดเสียงไฟล์เสียงเดียวกันด้วยโมเดล
whisper largeที่ดาวน์โหลดไว้แล้ว - โค้ดที่ใช้รันจะเรียก
transcribe(audio=audio_file, model='large')จากนั้นวัดเวลารวมจากส่วนต่างระหว่างเวลาเริ่มต้นและเวลาสิ้นสุด - ผลลัพธ์ที่คืนกลับมาเป็นรายการของเซกเมนต์ โดยแต่ละเซกเมนต์มีฟิลด์อย่าง
avg_logprob,compression_ratio,start,end,text,tokens - โครงสร้างผลลัพธ์นี้เหมือนกับตอนรัน Python Whisper บน RTX 4090
ผลลัพธ์พื้นฐาน: M1 Pro และ RTX 4090
- สำหรับไฟล์เสียงความยาว 10 นาที เวลาในการรันของ M1 Pro + MLX คือ
0:03:36.296329หรือประมาณ 216 วินาที - สำหรับไฟล์เดียวกัน เวลาในการรันของ Nvidia RTX 4090 วัดได้ที่
0:03:06.707770หรือประมาณ 186 วินาที - RTX 4090 เร็วกว่า M1 Pro ราว 30 วินาที หรือคิดเป็นประมาณ 16%
- ระหว่างการวัด GPU core ทั้งหมดของ M1 Pro ถูกใช้งานเต็มที่ และได้ปิดโปรแกรมอื่นรวมถึงองค์ประกอบอย่างพื้นหลังเดสก์ท็อป
- อย่างไรก็ตาม หากใช้โมเดลที่ปรับแต่งมาสำหรับ Nvidia เวลาในการถอดเสียงของ RTX 4090 สามารถลดลงเหลือเพียง 8 วินาที
ฮาร์ดแวร์ที่ใช้ทดสอบ
-
MacBook
- MacBook M1 Pro ขนาด 14 นิ้ว รุ่นปี 2021
- CPU 8 คอร์: คอร์ประสิทธิภาพ 6 คอร์, คอร์ประหยัดพลังงาน 2 คอร์
- RAM 32GB
- GPU 16 คอร์
-
PC
- Intel Core i7-12700KF 8×3.60GHz
- RAM 2×32GB 3200MHz DDR4 Kingston FURY Beast
- Kingston KC3000 PCIe 4.0 NVMe 1000GB SSD
- อ่าน 7000MB/s, เขียน 6000MB/s
- GeForce RTX 4090 24GB GDDR6X, Palit RTX 4090 GameRock OmniBlack
insanely-fast-whisper เปลี่ยนการเปรียบเทียบอย่างไร
- ในคอมเมนต์บน Hacker News มีผลการรันไฟล์ 10 นาทีเดียวกันด้วย insanely-fast-whisper และ RTX 4090
- สำหรับ whisper-large-v3 การถอดเสียงเสร็จในเวลาไม่ถึง 8 วินาที และถ้านับรวมเวลาโหลดโมเดลก่อนเริ่มถอดเสียงด้วย จะอยู่ที่ 15 วินาที
- จากนั้นได้ลองรันเองด้วยคำสั่ง
insanely-fast-whisper --file-name audio.mp3 --flash Trueและยืนยันการถอดเสียงที่ใช้เวลา 8 วินาที - ในล็อกผลลัพธ์มีคำเตือนเกี่ยวกับ Flash Attention 2 และการย้ายไปยัง GPU แต่การถอดเสียงเสร็จสมบูรณ์และสร้าง
output.jsonขึ้นมา - บน macOS สามารถรันด้วย
--device mps --batch-size 4และใช้เวลา 0:04:23 สำหรับการถอดเสียงไฟล์เดียวกัน
อัปเดต M2 Ultra และ M3 Max
- Ivan ได้รันไฟล์เสียงเดียวกันบน M2 Ultra 76 GPU core และ M3 Max 40 GPU core
- ทั้งสองระบบให้ผลลัพธ์เร็วกว่า M1 Pro มาก และมีความเร็วใกล้เคียงกัน
- ตัวเลขเปรียบเทียบเหล่านี้อาจมองเป็นเบนช์มาร์กที่แม่นยำ 100% ไม่ได้ เพราะโปรเซสอื่น เวลาโหลด และ cold start กับ warm start อาจส่งผลต่อผลลัพธ์
การใช้พลังงานและข้อจำกัดของการวัด
- ความต่างของการใช้พลังงานระหว่างสถานะว่างกับตอนรัน GPU วัดด้วย Shelly plug
- PC เพิ่มขึ้น +242W จากสถานะว่างเมื่อรัน RTX 4090
- MacBook เพิ่มขึ้น +38W จากสถานะว่างเมื่อรัน M1 GPU 16 คอร์
- การวัดพลังงานเองก็ไม่ใช่ค่าที่แม่นยำ 100% แต่ใกล้เคียงกับค่าที่ใช้อ้างอิงเพื่อดูแนวโน้ม
- การทดสอบทั้งหมดนี้เป็นการเปรียบเทียบเพื่อแสดงคร่าว ๆ ว่าเฟรมเวิร์ก MLX สามารถให้ประสิทธิภาพได้ประมาณไหน มากกว่าจะเป็นการวัดเชิงวิทยาศาสตร์
บริบทการใช้งานจริง
- จุดประสงค์ของการทดสอบเชื่อมโยงกับการดำเนินงานของเสิร์ชเอนจินพอดแคสต์ podpodgogo.com
- มีการถอดเสียงพอดแคสต์หลายหมื่นตอน ทำให้ค้นหาแบบ full-text ได้ และยังทำ data mining บางส่วนด้วย
- ประวัติการอัปเดต
- 11 ธันวาคม: เพิ่มสเปกฮาร์ดแวร์และการทดสอบเพิ่มเติมที่ไม่รวมเวลาโหลดโมเดล
- 12 ธันวาคม: ระบุ RTX 4090 ว่าเป็นกราฟิกการ์ดสำหรับผู้บริโภคที่เร็วที่สุด และอัปเดตตัวเลข M2/M3
- 13 ธันวาคม: ยืนยันคอมเมนต์บน Hacker News เกี่ยวกับ Whisper ที่ปรับแต่งสำหรับ Nvidia
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ถ้าไม่ได้รัน Whisper บน 4090 แบบไร้ประสิทธิภาพมาก ผลลัพธ์นี้ก็ดูน่าสงสัย
ฉันมีทั้ง 3090 และ M1 Max 32GB แม้จะยังไม่ได้ลอง Whisper แต่ความต่างด้านประสิทธิภาพในการอนุมานของ Llama และ Stable Diffusion นั้นมหาศาล โดยเฉพาะกับ Stable Diffusion ที่ SDXL ใช้เวลาประมาณ 9 วินาทีบน 3090 แต่บน M1 Max ใช้ราว 1 นาที 10 วินาที
สถาปัตยกรรมของทั้งสองโมเดลแทบไม่มีจุดร่วมกันเลย และแม้ Stable Diffusion จะใช้ text encoder ที่พรีเทรนมาจาก CLIP แต่นั่นก็ยังต่างจาก encoder-decoder transformer มาก
อีกอย่าง บทความนี้พูดถึงเฟรมเวิร์ก MLX ใหม่ของ Apple ดังนั้นมีโอกาสสูงว่าการทดสอบ Llama หรือ Stable Diffusion จะไม่ได้ใช้มัน
ไม่แน่ใจว่าเป็นข้อจำกัดของฮาร์ดแวร์หรือเป็นเพราะไลบรารี MLX ยังปรับแต่งไม่พอ แต่ก็ไม่น่าใช่ว่าจะมองข้ามเคสการใช้งานที่เด่นชัดแบบนี้ไปเฉย ๆ
คำอธิบายที่น่าจะเป็นไปได้มากกว่าคือ convolution ใช้ความแม่นยำสูงและชุดไทล์ที่ใหญ่กว่ามาก ทำให้ต้องมีการสลับ context ที่มีต้นทุนสูงเมื่อทรานส์ฟอร์มทั้งหมดไม่พอดีกับ GPU
ดังนั้นถ้าไม่ใช่ซอฟต์แวร์เดียวกันและโมเดลเดียวกัน สัญชาตญาณเรื่องประสิทธิภาพของ Whisper ต้องใช้ด้วยความระมัดระวังมาก
และถึงจะเหมือนกันทั้งหมด ความหมายของการเปรียบเทียบก็ยังจำกัดอยู่ดี เพราะแต่ละแพลตฟอร์มต้องการการปรับแต่งเฉพาะตัว
ดูเหมือนว่านี่จะใช้รีโพซิทอรี OpenAI Whisper
ถ้าจะเทียบให้เหมาะสม ควรเอา faster-whisper หรือ insanely-fast-whisper บน 4090 มาเทียบกับ MLX
faster-whisper ทำงานแบบลำดับต่อเนื่อง ส่วน insanely-fast-whisper จะประมวลผลเสียงเป็นช่วงละ 30 วินาที
ฉันใช้ Whisper ในโปรดักชันอยู่ และพบว่าคุณภาพดีกว่าเมื่อรวมข้อความจากช่วงก่อนหน้าเข้าไปด้วย เลยใช้ faster-whisper
โดยคร่าว ๆ faster-whisper มักเร็วกว่า OpenAI/whisper ราว 4–5 เท่า และ insanely-fast-whisper ก็อาจเร็วกว่า faster-whisper อีก 3–4 เท่า
โมเดลที่นี่ดูเหมือนยังเป็น fp16 ไม่ใช่โมเดล quantized ดังนั้นน่าจะยังมีช่องให้เร็วขึ้นได้อีก
แก้ไข: เห็นว่าตอนนี้ยังไม่รองรับการอนุมานบน CPU และถ้าเพิ่มเข้ามาก็น่าสนใจดี
อยากรู้การเทียบความเร็วตอนตั้งเป็น 5 ด้วย และในอุดมคติก็ควรเปิดพารามิเตอร์นี้ให้ผู้ใช้ปรับได้
ฉันต้องจัดการกับเสียงที่คุณภาพแย่มาก ดังนั้นคุณภาพการถอดเสียงจึงสำคัญ การเทียบความเร็วที่แลกมาด้วยคุณภาพสำหรับฉันจึงมีความหมายน้อย
ประเด็นสำคัญของโพสต์นี้คือมันใช้ Apple MLX ที่เพิ่งเปิดตัวใหม่ และโค้ดก็ใช้การปรับแต่งที่เฉพาะสำหรับ Apple
https://news.ycombinator.com/item?id=38539153
สำหรับ Whisper มี implementation ที่เร็วกว่าอยู่
แก้ไข: โดนหลอกให้สนใจจนได้ เลยโหลดไฟล์ 10 นาทีที่ใช้ในโพสต์มาลองรันด้วย insanely-fast-whisper บน 4090 และติดตั้งใช้แค่สองคำสั่ง
สำหรับ whisper-large-v3 การถอดเสียงไฟล์เสร็จในไม่ถึง 8 วินาที และถ้ารวมเวลาโหลดโมเดลก่อนเริ่มถอดเสียงก็เป็น 15 วินาที
เวลาเพิ่มส่วนนี้แน่นอนว่าไม่ได้ขึ้นกับความยาวของเสียง
ถ้าอย่างนั้น 4090 ก็เร็วกว่าเครื่อง Apple ระดับสูงสุดอยู่ 6–12 เท่า
ถ้ามีพีซีเกมมิงที่เสียบใช้อยู่แล้ว มันก็ถูกกว่า M2 Ultra มาก และถึงจะซื้อพีซีประกอบสำเร็จที่มี 4090 ใหม่ก็ยังถูกกว่าอยู่ดี
ไม่ใช่เรื่องน่าแปลกใจ แต่ดูเหมือนจะมี wishful thinking อยู่มากจากคนที่มี Mac ระดับสูงและอยากเชื่อว่าเครื่องของตัวเองเก่งทุกอย่าง
ชิป Apple M series น่าประทับใจมากและ RAM ขนาดใหญ่ก็ยอดเยี่ยม แต่ในงานแมชชีนเลิร์นนิงสมรรถนะสูงนั้นสู้ Nvidia ได้ยาก
ถ้ามี Mac ก็จะใช้ประสิทธิภาพของ Mac เครื่องนั้น และถ้ามีพีซีเกมมิงก็จะใช้ประสิทธิภาพของพีซีเครื่องนั้น
ต่อให้มีทั้งสองอย่าง สุดท้ายก็มักจะใช้ AI ที่รันบนเครื่องที่ตัวเองใช้อยู่ทุกวัน
สงสัยว่าถ้าเทียบกับ insanely-fast-whisper จะเป็นอย่างไร: https://github.com/Vaibhavs10/insanely-fast-whisper
เข้าใจว่า ถ้าไม่ใช้การปรับแต่งก็พอจะเทียบแบบ 1:1 ได้ แต่ถ้าการปรับแต่งนั้นยังไม่ได้พอร์ตมาเป็น MLX ก็ยังรู้สึกว่าการใช้ 4090 น่าจะดีกว่าอยู่ดี
ช่วงหลังได้ลองดู MLX มา บน Mac ดูมีแววว่าจะได้รับความนิยมแน่ ๆ และถ้ามี Swift binding ก็น่าจะไปได้ดีบน iOS ด้วย: https://github.com/ml-explore/mlx/issues/15
แต่ตอนนี้อาจยังติดปัญหาเรื่องการคอมไพล์ C++20 อยู่
ต่อให้ฮาร์ดแวร์ตัวไหนชนะในเบนช์มาร์ก ถ้าเป็นโมเดลยอดนิยมก็มักจะมี CUDA implementation ที่ปรับแต่งกันแบบลงมือทำอย่างหนักออกมา แล้วทิ้งตัวอื่นแบบไม่เห็นฝุ่น
ก็มีข้อยกเว้นที่พบได้ไม่บ่อย เช่น GPT-Fast บน AMD ที่ทำงานได้ดีในบางกรณีใช้งานเฉพาะทางแคบ ๆ เพราะ PyTorch ลงแรงกับ torch.compile
แต่ฝั่ง Apple Silicon นึกข้อยกเว้นแบบนั้นไม่ออกเลย
คิดว่าน่าจะชนะเบนช์มาร์กทั้งสองในบทความต้นฉบับได้แบบสบาย ๆ แต่ขนาดแบตช์น่าจะต้องตั้งให้เล็กกว่า 24 มาก
ถ้าวัดตามมาตรฐานทุกวันนี้ Whisper ที่ทำได้แค่ 3–4 เท่าของเวลาจริงถือว่าช้ามาก ดังนั้นเบนช์มาร์กนี้ CPU ก็น่าจะชนะได้
สงสัยว่าสิ่งนี้ใช้ได้กับโมเดลอื่นด้วยไหม หรือเป็นเพราะเลือกกรณีที่เข้าทางจาก ลักษณะการทำงานแบบลำดับ ของ Whisper กับการคำนวณจำนวนเต็ม
https://github.com/ml-explore/mlx-examples/tree/main/stable_... ดูเหมือนจะบอกใบ้ไปในทางนั้น
ในยุค 4 คอร์อาจพอรับได้ แต่กับจำนวนคอร์สมัยใหม่มันไม่สมเหตุสมผลแล้ว
ความสามารถในการขยายหน่วยความจำของ GPU ดีกว่ามากแม้แต่ในตลาดผู้บริโภค
การรัน Whisper บน Mac M1 ทำได้ไม่ยาก แต่ตามค่าเริ่มต้นจะไม่ได้ใช้ MLX
ผมเสียเวลาไปชั่วโมงสองชั่วโมงเพื่อหาว่าต้องติดตั้งและตั้งค่าอะไรบ้างถึงจะใช้ MLX ได้ แล้วก็เจอ Python error กับ Torch error ที่ไม่รู้สาเหตุ
สุดท้ายยอมแพ้แล้วไปเช่า VM ที่มี GPU แทน และสามารถรัน Whisper ได้ภายในไม่กี่นาที
ไม่ได้ใช้ MLX แต่ใช้ Metal
แม้จะมีข้อถกเถียงมากมายว่าอะไรคือทางเลือกที่ดีที่สุดแบบเด็ดขาดสำหรับงาน X แต่ผมชอบที่มันให้ประสิทธิภาพระดับนี้ได้ด้วย การใช้พลังงาน ที่ต่ำขนาดนี้
แต่ถ้าใช้ fork ของ Whisper ตัวนี้ เสียงยาว 1 ชั่วโมงก็ถอดความได้ในเวลาไม่ถึง 1 นาทีบน GPU ส่วนใหญ่: https://github.com/Vaibhavs10/insanely-fast-whisper
บน L4 แม้จะตั้งขนาดแบตช์ของ ctranslate2 ต่ำแค่ 4 ก็ยังชนะเบนช์มาร์กเหล่านั้นทั้งหมด ยกเว้น A100 ที่ใช้ flash attention 2
เสียดายที่โหมดแบตช์ไม่เคยเข้าไปอยู่ใน faster-whisper เสียที ซึ่งอาจเป็นเหตุผลว่าทำไมคนถึงไม่ค่อยได้ลอง ctranslate2 กันง่าย ๆ
รีโพอย่าง https://github.com/SYSTRAN/faster-whisper เข้าใจได้ทันทีว่าทำไมถึงเร็วกว่า implementation ดั้งเดิม และตัวอื่น ๆ ก็เร็วขึ้นเพราะลดความละเอียดของการ quantize แต่แลกกับผลลัพธ์ที่แย่ลง
แต่กรณีนี้กลับไม่ชัดเจนเป็นพิเศษว่าทำไมถึงเร็วกว่า
ยิ่งพอเห็นว่ามันเร็วกว่ามากก็ยิ่งน่าสงสัย
พอนึกถึง Vision Pro ของ Apple แล้วยิ่งน่าสนใจ
การรันโมเดลอย่างประหยัดพลังงานอาจไม่ใช่เรื่องสำคัญสำหรับทุกคนบนแล็ปท็อป แต่สำหรับเฮดเซ็ตที่กินไฟมากอยู่แล้ว นี่เป็นข้อได้เปรียบใหญ่
อยากขอคำแนะนำ
มีแอปหรือเวิร์กโฟลว์โอเพนซอร์ซที่ดีสำหรับ การถอดเสียงและแยกผู้พูด ไหม?
ลองดู https://github.com/thomasmol/cog-whisper-diarization กับ https://about.transcribee.net/ แล้ว แต่ทั้งคู่ทำงานได้ไม่ค่อยดี เช่น มีอาการแครช
แบ่ง MP3 ออกเป็นชิ้น ๆ ที่ Whisper จัดการได้ แล้วส่งเข้า API ทีละชิ้นเพื่อถอดเสียง
เท่าที่ผ่านมาก็ทำงานตามคาด และใช้โค้ด Python แค่ไม่กี่บรรทัด