TorchFix เป็นเครื่องมือวิเคราะห์แบบคงที่รหัส Python - linter ที่มีความสามารถอัตโนมัติ - สำหรับผู้ใช้ Pytorch มันสามารถใช้ในการค้นหาและแก้ไขปัญหาเช่นการใช้ฟังก์ชั่น pytorch ที่เลิกใช้แล้วและสัญลักษณ์ที่ไม่ใช่สาธารณะและใช้แนวทางปฏิบัติที่ดีที่สุดของ Pytorch โดยทั่วไป
TorchFix ถูกสร้างขึ้นเมื่อ https://github.com/instagram/libcst - ห้องสมุดเพื่อจัดการต้นไม้ไวยากรณ์คอนกรีต Python libcst เปิดใช้งาน "codemods" (autofixes) นอกเหนือจากปัญหาการรายงาน
TorchFix สามารถใช้เป็นปลั๊กอิน Flake8 (ผ้าสำลีเท่านั้น) หรือเป็นโปรแกรมแบบสแตนด์อโลน (พร้อม autofix สำหรับชุดย่อยของการละเมิดผ้าสำลี)
คำเตือน
ปัจจุบัน TorchFix อยู่ในขั้นตอน รุ่นเบต้า ดังนั้นยังมีขอบขรุขระจำนวนมากและมีหลายสิ่งหลายอย่างที่สามารถเปลี่ยนแปลงได้
ในการติดตั้งรหัสล่าสุดจาก GitHub, clone/ดาวน์โหลด https://github.com/pytorch-labs/torchfix และ Run pip install . ภายในไดเรกทอรี
ในการติดตั้งเวอร์ชันรีลีสจาก PYPI ให้เรียกใช้ pip install torchfix
หลังจากการติดตั้ง TorchFix จะพร้อมใช้งานเป็นปลั๊กอิน Flake8 ดังนั้นการเรียกใช้ Flake8 โดยปกติจะเรียกใช้ TorchFix Linter
หากต้องการดูคำเตือนของ Torchfix เพียงอย่างเดียวโดยไม่ต้องใช้สายรัด Flake8 ที่เหลือคุณสามารถเรียกใช้ flake8 --isolated --select=TOR0,TOR1,TOR2
TorchFix ยังสามารถเรียกใช้เป็นโปรแกรมแบบสแตนด์อโลน: torchfix . เพิ่ม --fix พารามิเตอร์การแก้ไขเพื่อพยายามที่จะแก้ไขปัญหาบางอย่าง (ไฟล์จะถูกเขียนทับ!) เพื่อดูข้อมูลการดีบักเพิ่มเติมบางส่วนเพิ่ม --show-stderr
คำเตือน
โปรดทราบว่า Autofix เป็นกลไกที่ดีที่สุด เมื่อพิจารณาถึงธรรมชาติของ Python และโดยเฉพาะอย่างยิ่งสถานะรุ่นเบต้าของ Torchfix มันเป็นเรื่องยากมากที่จะมีความมั่นใจเมื่อทำการเปลี่ยนแปลงรหัสแม้สำหรับการแก้ไขเล็กน้อย
คำเตือนสำหรับปัญหาเกี่ยวกับรหัสเริ่มต้นด้วย TOR0, TOR1 และ TOR2 ถูกเปิดใช้งานโดยค่าเริ่มต้น คำเตือนด้วยรหัสอื่นอาจมีเสียงดังเกินไปดังนั้นไม่ได้เปิดใช้งานโดยค่าเริ่มต้น ในการเปิดใช้งานให้ใช้ตัวเลือกการกำหนดค่ามาตรฐาน FLAKE8 สำหรับโหมดปลั๊กอินหรือใช้ torchfix --select=ALL . สำหรับโหมดสแตนด์อโลน
หากคุณพบข้อผิดพลาดหรือปัญหาอื่น ๆ กับ TorchFix โปรดยื่นปัญหาใน https://github.com/pytorch-labs/torchfix/issues
รหัสกฎใหม่ได้รับการกำหนดโดยเพิ่มขึ้นในหมวดหมู่ต่อไปนี้:
torch ทั่วไปpytorch/pytorch repo ผู้ใช้รายอื่นไม่ควรใช้สิ่งเหล่านี้TOR0, TOR1 และ TOR2 ถูกเปิดใช้งานโดยค่าเริ่มต้น
ฟังก์ชั่นนี้เลิกใช้งานตั้งแต่ Pytorch เวอร์ชัน 1.9 และตอนนี้ถูกลบออก
torch.solve เลิกใช้ในความโปรดปรานของ torch.linalg.solve torch.linalg.solve มีข้อโต้แย้งย้อนกลับและไม่คืนการแยกตัวประกอบ LU
เพื่อให้ได้การแยกตัวประกอบ LU ให้ดู torch.lu ซึ่งสามารถใช้กับ torch.lu_solve หรือ torch.lu_unpack
X = torch.solve(B, A).solution ควรถูกแทนที่ด้วย X = torch.linalg.solve(A, B)
ฟังก์ชั่นนี้เลิกใช้งานตั้งแต่ Pytorch เวอร์ชัน 1.9 และตอนนี้ถูกลบออก
torch.symeig เลิกใช้เพื่อประโยชน์ของ torch.linalg.eigh
พฤติกรรมเริ่มต้นได้เปลี่ยนจากการใช้ส่วนสามเหลี่ยมด้านบนของเมทริกซ์โดยค่าเริ่มต้นเป็นการใช้ส่วนสามเหลี่ยมที่ต่ำกว่า
L , _ = torch . symeig ( A , upper = upper )ควรถูกแทนที่ด้วย
L = torch . linalg . eigvalsh ( A , UPLO = 'U' if upper else 'L' )และ
L , V = torch . symeig ( A , eigenvectors = True )ควรถูกแทนที่ด้วย
L , V = torch . linalg . eigh ( A , UPLO = 'U' if upper else 'L' )require_grad ในการมอบหมาย คุณหมายถึง requires_grad ?นี่คือการสะกดผิดทั่วไปที่สามารถนำไปสู่ปัญหาประสิทธิภาพเงียบ
use_reentrant ไปยัง checkpoint อย่างชัดเจน ค่าเริ่มต้นของพารามิเตอร์ use_reentrant ใน torch.utils.checkpoint กำลังถูกเปลี่ยนจาก True เป็น False ในระหว่างนี้ค่าจะต้องผ่านอย่างชัดเจน
ดูโพสต์ฟอรัมนี้สำหรับรายละเอียด
ดู TOR001
ฟังก์ชั่นนี้เลิกใช้แล้ว ใช้ torch.nn.utils.parametrizations.weight_norm ซึ่งใช้ API parametrization ที่ทันสมัย weight_norm ใหม่เข้ากันได้กับ state_dict ที่สร้างขึ้นจาก Old weight_norm
คู่มือการย้ายถิ่น:
ขนาด ( weight_g ) และทิศทาง ( weight_v ) ตอนนี้แสดงเป็น parametrizations.weight.original0 และ parametrizations.weight.original1 ตามลำดับ
ในการลบการปรับเปลี่ยนการปรับน้ำหนักให้เป็นมาตรฐานให้ใช้ torch.nn.utils.parametrize.remove_parametrizations
น้ำหนักจะไม่คำนวณใหม่อีกครั้งที่โมดูลไปข้างหน้า; แต่จะคำนวณใหม่ในทุกการเข้าถึง ในการกู้คืนพฤติกรรมเก่าให้ใช้ torch.nn.utils.parametrize.cached ก่อนที่จะเรียกใช้โมดูลที่เป็นปัญหา
ฟังก์ชั่นนี้เลิกใช้แล้ว ใช้ torch.nn.attention.sdpa_kernel Manager แทน
คู่มือการโยกย้าย: พารามิเตอร์อินพุตบูลีนแต่ละตัว (การผิดนัดเป็นจริงเว้นแต่ระบุไว้) ของ sdp_kernel สอดคล้องกับ SDPBackened หากพารามิเตอร์อินพุตเป็นจริงควรเพิ่มแบ็กเอนด์ที่สอดคล้องกันในรายการอินพุตของ sdpa_kernel
ฟังก์ชั่นนี้เลิกใช้แล้วในความโปรดปรานของ torch.linalg.multi_dot
คู่มือการโยกย้าย: multi_dot ยอมรับรายการของเทนเซอร์สองตัวขึ้นไปในขณะที่ chain_matmul ยอมรับหลายเทนเซอร์เป็นอาร์กิวเมนต์อินพุต สำหรับการย้ายถิ่นให้แปลงหลายเทนเซอร์ในการโต้แย้งของ chain_matmul เป็นรายการของเทนเซอร์สองตัวขึ้นไปสำหรับ multi_dot
ตัวอย่าง: แทนที่ torch.chain_matmul(a, b, c) ด้วย torch.linalg.multi_dot([a, b, c])
torch.cholesky() เลิกใช้เพื่อสนับสนุน torch.linalg.cholesky()
คู่มือการย้ายถิ่น:
L = torch.cholesky(A) ควรถูกแทนที่ด้วย L = torch.linalg.cholesky(A)L = torch.cholesky(A, upper=True) ควรถูกแทนที่ด้วย L = torch.linalg.cholesky(A).mH torch.qr() เลิกใช้เพื่อประโยชน์ของ torch.linalg.qr()
คู่มือการย้ายถิ่น:
Q, R = torch.qr(A) ควรถูกแทนที่ด้วย Q, R = torch.linalg.qr(A)some ของ torch.qr จะถูกแทนที่ด้วย mode พารามิเตอร์สตริงใน torch.linalg.qr การเปลี่ยนแปลงที่สอดคล้องกันในการใช้งานมาจาก Q, R = torch.qr(A, some=False) ถึง Q, R = torch.linalg.qr(A, mode="complete") Function torch.range() เลิกใช้เนื่องจากการใช้งานไม่เข้ากันกับช่วงในตัวของ Python ให้ใช้ torch.arange() แทนการสร้างค่าใน [start, end)
คู่มือการย้ายถิ่น:
torch.range(start, end) สร้างค่าในช่วงของ [start, end] แต่ torch.arange(start, end) สร้างค่าใน [start, end) สำหรับขนาดขั้นตอนที่ 1 ให้อพยพการใช้งานจาก torch.range(start, end, 1) ถึง torch.arange(start, end+1, 1)torch.load Without weights_only พารามิเตอร์ไม่ปลอดภัย ตั้ง weights_only เป็นเท็จอย่างชัดเจนเฉพาะในกรณีที่คุณเชื่อถือข้อมูลที่คุณโหลดและฟังก์ชันการทำงานของดองเต็มรูปแบบไม่เช่นนั้นตั้ง weights_only=True
ดู TOR101
TorchFix ได้รับใบอนุญาตใบอนุญาต BSD ตามที่พบในไฟล์ใบอนุญาต