يقوم gotch
بإنشاء غلاف رقيق لواجهات برمجة تطبيقات Pytorch C++ (Libtorch) للاستفادة من واجهات برمجة تطبيقات موتر C++ المحسنة بالفعل (3039) وحساب الرسم البياني الديناميكي مع دعم CUDA ويوفر واجهات برمجة تطبيقات Go الاصطلاحية لتطوير وتنفيذ التعلم العميق في Go.
بعض الميزات
gotch
في وضع التطوير النشط وقد يكون به تغييرات في واجهة برمجة التطبيقات (API). لا تتردد في سحب الطلب أو الإبلاغ عن المشكلات أو مناقشة أي مخاوف. جميع المساهمات هي موضع ترحيب.
gotch
الإصدار الحالي هو v0.9.1
11.8
إذا كان CUDA متاحًا بخلاف ذلك باستخدام إصدار وحدة المعالجة المركزية.2.1.0
ملاحظة : سيتم تثبيت libtorch
على /usr/local/lib
wget https://github.com/sugarme/gotch/releases/download/v0.9.0/setup-libtorch.sh
chmod +x setup-libtorch.sh
export CUDA_VER=cpu && bash setup-libtorch.sh
بيئة التحديث : في Debian/Ubuntu، قم بإضافة/تحديث الأسطر التالية إلى ملف .bashrc
export GOTCH_LIBTORCH= " /usr/local/lib/libtorch "
export LIBRARY_PATH= " $LIBRARY_PATH : $GOTCH_LIBTORCH /lib "
export CPATH= " $CPATH : $GOTCH_LIBTORCH /lib: $GOTCH_LIBTORCH /include: $GOTCH_LIBTORCH /include/torch/csrc/api/include "
export LD_LIBRARY_PATH= " $LD_LIBRARY_PATH : $GOTCH_LIBTORCH /lib "
wget https://github.com/sugarme/gotch/releases/download/v0.9.0/setup-gotch.sh
chmod +x setup-gotch.sh
export CUDA_VER=cpu && export GOTCH_VER=v0.9.1 && bash setup-gotch.sh
ملاحظة : تأكد من أن جهازك يعمل بنظام CUDA.
nvidia-smi
wget https://github.com/sugarme/gotch/releases/download/v0.9.0/setup-libtorch.sh
chmod +x setup-libtorch.sh
export CUDA_VER=11.8 && bash setup-libtorch.sh
بيئة التحديث : في Debian/Ubuntu، قم بإضافة/تحديث الأسطر التالية إلى ملف .bashrc
export GOTCH_LIBTORCH= " /usr/local/lib/libtorch "
export LIBRARY_PATH= " $LIBRARY_PATH : $GOTCH_LIBTORCH /lib "
export CPATH= " $CPATH : $GOTCH_LIBTORCH /lib: $GOTCH_LIBTORCH /include: $GOTCH_LIBTORCH /include/torch/csrc/api/include "
LD_LIBRARY_PATH= " $LD_LIBRARY_PATH : $GOTCH_LIBTORCH /lib:/usr/lib64-nvidia:/usr/local/cuda- ${CUDA_VERSION} /lib64 "
wget https://github.com/sugarme/gotch/releases/download/v0.9.0/setup-gotch.sh
chmod +x setup-gotch.sh
export CUDA_VER=11.8 && export GOTCH_VER=v0.9.1 && bash setup-gotch.sh
import (
"fmt"
"github.com/sugarme/gotch"
"github.com/sugarme/gotch/ts"
)
func basicOps () {
xs := ts . MustRand ([] int64 { 3 , 5 , 6 }, gotch . Float , gotch . CPU )
fmt . Printf ( "%8.3f n " , xs )
fmt . Printf ( "%i" , xs )
/*
(1,.,.) =
0.391 0.055 0.638 0.514 0.757 0.446
0.817 0.075 0.437 0.452 0.077 0.492
0.504 0.945 0.863 0.243 0.254 0.640
0.850 0.132 0.763 0.572 0.216 0.116
0.410 0.660 0.156 0.336 0.885 0.391
(2,.,.) =
0.952 0.731 0.380 0.390 0.374 0.001
0.455 0.142 0.088 0.039 0.862 0.939
0.621 0.198 0.728 0.914 0.168 0.057
0.655 0.231 0.680 0.069 0.803 0.243
0.853 0.729 0.983 0.534 0.749 0.624
(3,.,.) =
0.734 0.447 0.914 0.956 0.269 0.000
0.427 0.034 0.477 0.535 0.440 0.972
0.407 0.945 0.099 0.184 0.778 0.058
0.482 0.996 0.085 0.605 0.282 0.671
0.887 0.029 0.005 0.216 0.354 0.262
TENSOR INFO:
Shape: [3 5 6]
DType: float32
Device: {CPU 1}
Defined: true
*/
// Basic tensor operations
ts1 := ts . MustArange ( ts . IntScalar ( 6 ), gotch . Int64 , gotch . CPU ). MustView ([] int64 { 2 , 3 }, true )
defer ts1 . MustDrop ()
ts2 := ts . MustOnes ([] int64 { 3 , 4 }, gotch . Int64 , gotch . CPU )
defer ts2 . MustDrop ()
mul := ts1 . MustMatmul ( ts2 , false )
defer mul . MustDrop ()
fmt . Printf ( "ts1: n %2d" , ts1 )
fmt . Printf ( "ts2: n %2d" , ts2 )
fmt . Printf ( "mul tensor (ts1 x ts2): n %2d" , mul )
/*
ts1:
0 1 2
3 4 5
ts2:
1 1 1 1
1 1 1 1
1 1 1 1
mul tensor (ts1 x ts2):
3 3 3 3
12 12 12 12
*/
// In-place operation
ts3 := ts . MustOnes ([] int64 { 2 , 3 }, gotch . Float , gotch . CPU )
fmt . Printf ( "Before: n %v" , ts3 )
ts3 . MustAddScalar_ ( ts . FloatScalar ( 2.0 ))
fmt . Printf ( "After (ts3 + 2.0): n %v" , ts3 )
/*
Before:
1 1 1
1 1 1
After (ts3 + 2.0):
3 3 3
3 3 3
*/
}
import (
"fmt"
"github.com/sugarme/gotch"
"github.com/sugarme/gotch/nn"
"github.com/sugarme/gotch/ts"
)
type Net struct {
conv1 * nn. Conv2D
conv2 * nn. Conv2D
fc * nn. Linear
}
func newNet ( vs * nn. Path ) * Net {
conv1 := nn . NewConv2D ( vs , 1 , 16 , 2 , nn . DefaultConv2DConfig ())
conv2 := nn . NewConv2D ( vs , 16 , 10 , 2 , nn . DefaultConv2DConfig ())
fc := nn . NewLinear ( vs , 10 , 10 , nn . DefaultLinearConfig ())
return & Net {
conv1 ,
conv2 ,
fc ,
}
}
func ( n Net ) ForwardT ( xs * ts. Tensor , train bool ) * ts. Tensor {
xs = xs . MustView ([] int64 { - 1 , 1 , 8 , 8 }, false )
outC1 := xs . Apply ( n . conv1 )
outMP1 := outC1 . MaxPool2DDefault ( 2 , true )
defer outMP1 . MustDrop ()
outC2 := outMP1 . Apply ( n . conv2 )
outMP2 := outC2 . MaxPool2DDefault ( 2 , true )
outView2 := outMP2 . MustView ([] int64 { - 1 , 10 }, true )
defer outView2 . MustDrop ()
outFC := outView2 . Apply ( n . fc )
return outFC . MustRelu ( true )
}
func main () {
vs := nn . NewVarStore ( gotch . CPU )
net := newNet ( vs . Root ())
xs := ts . MustOnes ([] int64 { 8 , 8 }, gotch . Float , gotch . CPU )
logits := net . ForwardT ( xs , false )
fmt . Printf ( "Logits: %0.3f" , logits )
}
//Logits: 0.000 0.000 0.000 0.225 0.321 0.147 0.000 0.207 0.000 0.000
gotch
على Google Colab أو محليًا gotch
هو Apache 2.0 مرخص.