บิลด์ Windows ของ SciPy สำหรับ Python 3.12 ถูกยกให้เป็นปาฏิหาริย์เล็ก ๆ
(labs.quansight.org)- บิลด์ SciPy บน Windows ของ conda-forge ถูกปล่อยออกมาภายในสองวันหลังการออก Python 3.12.0 ทำให้การย้าย SciPy ไปยัง Python 3.12 ล่าช้าเพียงไม่กี่วัน แทนที่จะหยุดชะงักนานหลายเดือน
- เมื่อ distutils ถูกถอดออกจากไลบรารีมาตรฐานใน Python 3.12 ทาง SciPy จึงตัดสินใจย้ายจาก
numpy.distutilsไปใช้เครื่องมือบิลด์ Meson - Meson กำลังจะปฏิเสธชุดคอมไพเลอร์ MSVC+gfortran ที่ conda-forge ใช้อยู่ และบน Windows ก็ไม่มี Fortran compiler แบบฟรีที่เข้ากันได้กับ ABI ให้ conda-forge ใช้งาน
- conda-forge คาดว่า หากไม่สามารถบิลด์ SciPy บน Windows ใหม่ได้ การย้ายแพ็กเกจอย่างน้อยราว 1,000 ตัวที่พึ่งพา SciPy จะล่าช้าบนทุกแพลตฟอร์ม หรือไม่ก็ต้องตัด Windows ออกจากการย้าย Python
- LLVM 17.0 เป็นรีลีสแรกที่ลบแฟลก
-flang-experimental-execออกจาก Flang และคาดว่า Flang มีระดับความพร้อมประมาณ “0.8 level maturity” - หลังเพิ่มการรองรับ llvm-flang ให้ Meson ก็สามารถบิลด์และติดตั้ง SciPy ได้สำเร็จ โดยผลทดสอบคือ
54,987 passed,2,866 skipped,245 xfailed,11 xpassed,1 warningและผ่านครบ 100% {p:100}
3 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เป็นบทความที่ยอดเยี่ยมจริง ๆ และตอนนี้ก็เข้าใจแล้วว่าทำไม
pip installถึงล้มเหลวใน Python 3.12 แต่จากนี้ไปดูเหมือนอนาคตจะสดใสขึ้นผมชอบ Python แต่บทความนี้ยังช่วยให้เข้าใจด้วยว่าทำไมการแพ็กเกจของ Python ถึงเป็นความวุ่นวายที่ยังพอจัดการได้
สาเหตุไม่ได้อยู่ที่ตัว Python เอง แต่อยู่ที่ความไม่เป็นมาตรฐานของเครื่องมือ build สำหรับ C/C++/Fortran และขนาดมหึมาของ ecosystem ซึ่งเป็นความซับซ้อนที่ลดทอนไม่ได้ในระดับหนึ่ง
แค่สิ่งนี้ทำงานได้ก็แทบจะเป็นปาฏิหาริย์แล้ว
ความสำเร็จของ Python ส่วนใหญ่เกิดจากการที่สามารถใช้ แพ็กเกจแบบผสมหลายภาษา ที่สำคัญได้ และตัวจัดการแพ็กเกจของภาษา mainstream อื่น ๆ แทบไม่ต้องรับมือกับปัญหาแบบนี้
ตัวอย่างเช่น
cargoของ Rust นั้นยอดเยี่ยม แต่ส่วนใหญ่สามารถสมมติได้ว่าแพ็กเกจเป็นโค้ด Rust ล้วน และแม้จะเป็นภาษาที่ต้องคอมไพล์ แต่ภาษาก็ “เป็นเจ้าของ” คอมไพเลอร์เอง ทำให้กลยุทธ์การแจกจ่ายแบบ build จากซอร์สใช้ได้ผลผมไม่รู้ว่า
cargoจัดการ Fortran เป็นค่าเริ่มต้นอย่างไร แต่ถ้าแพ็กเกจcargoชั้นนำบน Windows ต้องใช้โค้ด Fortran ก็คงยากที่จะทำงานได้ราบรื่นการปรับปรุงครั้งใหญ่ที่สุดของ ecosystem Python คือการทำให้ wheel ซึ่งเป็นรูปแบบแพ็กเกจแบบไบนารีกลายเป็นมาตรฐาน และนับแต่นั้น ecosystem Python สายวิทยาศาสตร์จึงเริ่มเติบโตบน Windows อย่างจริงจัง
อย่างไรก็ตาม ความเข้ากันได้ของไบนารีเป็นเรื่องปวดหัวมหาศาล โดยเฉพาะเมื่อต้องข้ามทั้งภาษาและ CPU
ความซับซ้อนของ ecosystem ซอฟต์แวร์ดูเหมือนจะเพิ่มขึ้นแบบเอ็กซ์โปเนนเชียล และก็สงสัยว่าอะไรคือสิ่งที่ป้องกันไม่ให้ท้ายที่สุดมันกลายเป็น การล่มสลายแบบหอบาเบล
แน่นอนว่านี่ไม่ใช่ปัญหาเฉพาะซอฟต์แวร์เท่านั้น แต่เป็นตัวอย่างที่ดี
ผมเห็นบ่อย ๆ ว่าคนเอาตัวจัดการแพ็กเกจที่ตัวเองชอบไปเทียบกับของ Python แล้วสรุปว่า Python แย่มาก แต่ในความเป็นจริงไม่ใช่อย่างนั้น
อย่างเดียวที่ยังไม่ค่อยเข้าใจคือ ทำไมฝั่ง Python ถึงไม่ใช้ ไลบรารีคณิตศาสตร์ C/C++ แทน Fortran
กลายเป็นความยุ่งเหยิงซ้อนทับบนความยุ่งเหยิงอีกชั้น
ตอนที่ Linux ยังเป็นกรณีชายขอบที่ง่อนแง่น ซึ่งถูกดูแลโดยแฮ็กเกอร์ที่ประสานงานกันอย่างหลวม ๆ และบางครั้งก็มีข้อจำกัดทางอุดมการณ์ที่ไม่ค่อยปฏิบัติได้จริง การที่คนเก่ง ๆ ทุ่มความพยายามอย่างมากเพื่อเพิ่มการรองรับให้มันเป็นเรื่องที่น่าทึ่งมาก
แต่ตอนนี้กรณีชายขอบที่ง่อนแง่นนั้นกลายเป็น ระบบปิดกรรมสิทธิ์ ที่ข้อจำกัดมีลักษณะใกล้เคียงกับความเป็นปฏิปักษ์ และถูกดำเนินการโดยเหล่าเจ้าที่ดินไซเบอร์ จึงยากที่จะมองงานสนับสนุนมันในแง่บวกเท่าเดิม
อีกด้านหนึ่ง ความใส่ใจอย่างลึกซึ้งที่ทำให้ทุกคนใช้เครื่องมือเหล่านี้ได้เป็นสิ่งที่ยอดเยี่ยมจริง ๆ และขอปรบมือให้กับงานนั้น
ไม่ได้จะบอกให้เปลี่ยนทิศทางเลย แค่เป็นเรื่องที่ทำให้ต้องคิดทบทวน
เมื่อก่อนผมคงคิดว่า “ว้าว ดีจริง ๆ ที่งานนี้กำลังเดินหน้า” แต่ตอนนี้กลับคิดมากกว่าว่า “ว้าว ถ้าคนเก่ง ๆ เหล่านั้นไม่ต้องมาจมอยู่กับงานแบบนี้ พวกเขาจะทำอะไรสำเร็จได้บ้างนะ”
อย่างที่มีการพูดถึงหลายครั้ง นักพัฒนา SciPy เป็นอาสาสมัคร
เนื้อหาส่วนใหญ่ของเรื่องอธิบายว่าทำไม SciPy จึงทำได้เพียงหวังว่าจะมีใครสักคนสร้างคอมไพเลอร์ Fortran แบบโอเพนซอร์สสำหรับ Windows ให้ และดูเหมือนว่าผู้กอบกู้ส่วนใหญ่คือ นักพัฒนา NVIDIA
SciPy กำลังจ่ายราคาจากการตัดสินใจที่โง่เขลาและลำเอียงอย่างมากของนักพัฒนาหลัก Python ที่เลือก MSVC แทน MinGW เป็น toolchain สำหรับ Python บน Windows
ผมมองว่าแรงจูงใจนั้นมาจากการสนับสนุนของ Microsoft
ในรายชื่อนักพัฒนาหลักมีพนักงาน Microsoft อยู่ไม่น้อย พวกเขาได้รับค่าตอบแทนจาก Microsoft เพื่อเข้าร่วมในรายชื่อนั้น และนอกจากนี้ Microsoft ยังออกค่าใช้จ่ายเซิร์ฟเวอร์ CI ของโปรเจกต์ CPython ด้วย
ถ้า Python ไม่ใช้เครื่องมือกรรมสิทธิ์ใน toolchain ปัญหาทั้งหมดนี้ก็คงหลีกเลี่ยงได้
ที่บอกว่า “Meson พยายามปฏิเสธชุดผสม MSVC+gfortran ที่ใช้กันใน conda-forge” ฟังดูเหมือนบั๊ก
ผมมองว่าเป้าหมายของ เครื่องมือบิลด์ คือการรันคำสั่งที่ถูกสั่ง ไม่ใช่มาขวางแบบ “ขอโทษนะ Dave”
ปัญหาคือ C runtime ที่ MSVC กับ gfortran ใช้นั้น โดยเฉพาะไลบรารี runtime ของ gfortran เองที่เขียนด้วย C ไม่ได้เข้ากันได้ในระดับ ABI
วิธีเลี่ยงที่ NumPy เคยใช้คือการลิงก์อ็อบเจ็กต์ Fortran เป็น DLL เพื่อเพิ่มชั้นอ้อมที่เรียกว่า import library แล้วปลอบ MSVC ให้ยอม
ดังนั้นจึงต้องมีงานเพิ่มเติมเพื่อสร้าง DLL แบบนี้
จะทำในไฟล์คำอธิบายการบิลด์หรือใน Meson ก็ต้องทำอยู่ดี แต่ฝั่ง SciPy ไม่อยาก implement ชั้นอ้อมนี้ในทางใดทางหนึ่ง และนักพัฒนา Meson ก็ไม่ได้อยากช่วยอย่างแข็งขัน
แน่นอนว่านักพัฒนา Meson ช่วยเรื่องทั่วไปอย่างการรองรับ Fortran และ Cython แต่ไม่อยากจัดหาแท่นเหยียบที่อันตราย
ในทางปฏิบัติมันแทบจะเป็นการแฮ็ก และตัวอย่างเช่น มันทำงานได้ก็เพราะฝั่ง Fortran ไม่ได้ใช้ไฟล์ที่เปิดจากฝั่ง Python/C
https://web.archive.org/web/20180711144501/https://pav.iki.f...
โดยส่วนตัวผมเห็น Bazel บ่อยกว่า Meson
Meson เขียนด้วย Python เลยน่าจะดูเป็นตัวเลือกที่ดีสำหรับ SciPy และสุดท้ายก็จบได้ด้วยดี ก็ต้องยินดีด้วย
ถึงอย่างนั้น แม้จะมีความประหลาด ความซับซ้อน และปัญหาหลายอย่าง ผมยังมองว่า CMake ยังค่อนข้างใกล้เคียงมาตรฐานอยู่ดี
มันยังสามารถประกอบคำสั่งขึ้นมาเองเพื่อรองรับ MSVC/gcc/clang ได้ด้วย
ถ้าขอให้มันประกอบคำสั่งสำหรับชุดผสมที่ไม่รู้จัก ก็แน่นอนว่ามันทำได้แค่พูดว่า “ขอโทษนะ Dave”
ขอเปิดเผยไว้ก่อนว่าผมเป็นผู้เขียน ระบบบิลด์คู่แข่งของ Meson ที่จะเปิดตัวเร็ว ๆ นี้
แต่ rant เล็ก ๆ ที่ไม่ค่อยมีคนรู้จักชิ้นหนึ่ง [1] นี่แหละที่ทำให้ผมตระหนักถึงสิ่งที่เพิ่งพูดไป
สรุปคือ build system ควรรันคำสั่งที่ผู้ใช้บอกให้รัน แค่นั้น
เพราะบางครั้งโปรแกรมเมอร์ก็รู้จริง ๆ ว่าตัวเองกำลังทำอะไรอยู่
น่าอายที่ก่อนอ่านคอมเมนต์นั้น ผมเคยคิดจะทำ build system ของตัวเองให้เหมือนมีเวทมนตร์
แต่หลังจากอ่านคอมเมนต์นั้น ผมก็เข้าใจว่าสิ่งที่ทำให้ผู้คนเกลียด build system ก็คือ “เวทมนตร์” นั่นเอง
[1]: https://ofekshilon.com/2016/08/30/cmake-rants/#comment-29273
นึกว่าเรื่องแบบนี้ทุกคนก็ใช้ WSL2 แล้วจบไปแล้วเสียอีก
ทำไมถึงต้องพยายามบิลด์เวอร์ชัน native Windows ด้วย?
การทำงานใน virtual machine ไม่สะดวกและ การผสานรวม ก็แย่กว่า
นักศึกษาก็เช่นกัน
โดยเฉพาะเมื่อสามารถใช้ Docker Desktop บนนั้นได้ด้วย
ถือเป็นการรีดสิ่งที่ดีที่สุดออกมาจากสถานการณ์ที่ไม่สมบูรณ์แบบ
καταστροφήตรงκαταไม่ได้หมายถึง “ความฉับพลัน” แต่ใกล้กับ “ลงข้างล่าง” หรือ “ตาม” มากกว่า และมีนัยแรงว่าหักเหไปในทิศทางที่ไม่ดีคำตรงข้ามของ
καταโดยทั่วไปคือαναแต่αναστροφήแปลตามตัวอักษรว่า “การหมุนขึ้น” หรือการกลับด้านดังนั้นคำประดิษฐ์อย่าง
ευστροφηหรือ eustrophe ที่หมายถึง “การเปลี่ยนผ่านที่ดี” อาจจะดีกว่าถึงอย่างนั้น ถ้าจะเถียงชนะ JRR Tolkien เรื่องการสร้างคำภาษาได้ นั่นก็คงเป็น
ευκαταστροφηหรือโชคดีนั่นเองโดยรวมแล้วชอบที่จับความรู้สึกของพระคุณอันท่วมท้นได้ และสิ่งแบบนั้นก็มอบความยินดีและความสุขให้โลก
kataในkatastrofiจริง ๆ แล้วใกล้กับ “against” มากกว่า ดังนั้น katastrofi จึงเทียบได้กับการที่สิ่งหนึ่ง “หันหลังให้”ผมรู้สึกว่า BLAS ที่ดีที่สุดส่วนใหญ่เขียนด้วย C
อย่าง MKL, BLIS, OpenBLAS เป็นต้น
สงสัยเหมือนกันว่าจะไปได้ไกลแค่ไหนถ้าใช้แค่ C กับ Python
และก็สงสัยว่าถ้าเริ่มตอนนี้ อาจเลือก
libflameไปเลยหรือเปล่าแน่นอนว่า SciPy ยังมีฟีเจอร์อื่น ๆ อีกมาก เช่น iterative methods, sparse matrices ดังนั้นการเลี่ยง Fortran อาจทำได้ยาก
แต่ Fortran ก็เป็นภาษาที่ยอดเยี่ยม และดีใจที่สถานการณ์เครื่องมือบน Windows อย่างน้อยก็เริ่มดีขึ้นแล้ว
ใน SciPy เองก็มีโค้ด Fortran อยู่มาก และถ้าจะเขียนใหม่ต้องใช้กำลังคนระดับหลายปี
หลังจากเป็นไปได้แล้ว ส่วนแกนหลักบางส่วนที่เคยใช้ Fortran ก็ถูกเอาออกไปเหมือนกัน
เช่นส่วนที่เกี่ยวกับ FFT
เป็นบทความที่ยอดเยี่ยม
ปีนี้ผมใช้เวลามากไปกับการทำให้โปรเจกต์ CMake C++ ที่มี Python bindings ทันสมัยขึ้น และหลังจากเพิ่มเข้า conda-forge เป็น feedstock ใหม่ได้สำเร็จ ก็พูดได้อย่างมั่นใจว่า
ถ้าผมได้เป็นจักรพรรดิเทพ มาตรการแรกด้าน IT ของผมคือการถอนรากถอนโคน Windows ออกไปจากทุกจักรวาลตลอดกาล
เป็นคำถามที่ซื่อมาก ๆ แต่ semantics ของ Fortran ต่างกันขนาดที่ไม่สามารถแปลงเป็น C ก่อน แล้วค่อยคอมไพล์ด้วยคอมไพเลอร์ C ได้หรือ?
หลังจากนั้นก็น่าจะดูแลรักษาต่อเป็น C ได้ไม่ใช่หรือ?
ไม่น่าจะมีคนสาย Fortran ที่ดูแลไลบรารีเก่า ๆ แบบนี้มากนัก แต่ก็ยังต้องดูแลรักษาอยู่ดีไม่ใช่หรือ?
Fortran ไม่มี pointer มีแค่ array และอาร์กิวเมนต์ของฟังก์ชันไม่สามารถเป็น alias กันได้ ดังนั้นถ้าพักเรื่องความน่ากลัวของบล็อก
COMMONไว้ก่อน การ optimize แบบ aggressive และการ vectorize ก็ทำได้ง่ายกว่าไลบรารีคณิตศาสตร์มาตรฐานของ Fortran นั้นใช้งานได้ดีและเร็วอยู่แล้ว
ใน C/C++ โดยเฉพาะถ้าใช้คีย์เวิร์ด
restrictของ C ก็สามารถเขียนโค้ดที่เร็วเทียบเท่าได้แต่ถ้าแปลงโค้ดเดิมผ่านขั้นตอน
f2cในหลายกรณี performance จะตกลงมากนักพัฒนา Fortran ก็มีอยู่มากพอ
มันแย่มากสำหรับการพัฒนาแอปพลิเคชัน แต่นั่นก็ไม่ใช่พื้นที่หลักของ Fortran
f2c มีมาหลายสิบปีแล้ว
มีเรื่องเล็ก ๆ ที่สงสัยอยู่ อย่างที่ผมเข้าใจ
aarch64กับarm64คือสิ่งเดียวกันผมเข้าใจผิดหรือเปล่า?
[1] https://www.phoronix.com/news/MTY5ODk
aarch64มักหมายถึง Linux ส่วนarm64มักหมายถึง macOS ARMผมไม่ได้รู้ด้านนี้ดีพอที่จะเข้าใจว่าทำไมชื่อถึงต่างกัน
การเปลี่ยนแปลงระบบ build ของ Python ตามให้ทันได้ยากจริง ๆ
ก็อยากรู้ตัวเลข performance บน Windows เหมือนกัน
แต่โดยหลักแล้วอาจไม่สำคัญนัก
เพราะงานจริงจังน่าจะรันบนเครื่อง Linux
การเปลี่ยนผ่านครั้งใหญ่คือการทำให้ทุกคนยอมรับ PEP 517 โดยเฉพาะการย้ายโปรเจกต์ Setuptools เดิม
เพราะ 99.9% ของเวลาคือการรัน โค้ดของผู้ใช้ ไม่ใช่ระบบปฏิบัติการ
นี่เป็นกรณีที่เผยให้เห็นอย่างชัดเจนเลยว่าเราต้องไปพึ่งพาภาษาแบบคอมไพล์เป็นไบนารีอย่างน่าเวทนาแค่ไหน
แก้ได้ในฝั่ง Python แต่ในอีโคซิสเต็มอื่นยังแก้ไม่ได้ไม่ใช่หรือ? เพราะอย่างนั้นถึงต้องมีการแจกไบนารีที่คอมไพล์ไว้ล่วงหน้าไงล่ะ