Cấu trúc phần mềm của SINGA bao gồm hai cấp độ chính, cấp thấp backend classes và cấp giao diện Python. Hình 1 mô tả chúng cùng với phần cứng. Cấu tạo backend cung cấp cấu trúc dữ liệu cơ bản cho các mô hình deep learning, khái quát phần cứng để kế hoạch và thực hiện các phép tính, trong khi thành phần communication dùng cho distributed training. Giao diện Python tập hợp cấu trúc dữ liệu CPP và cung cấp các classes cấp cao bổ sung cho việc train neural network, giúp tiện lợi hơn khi thực hiện các mô hình neural network phức tạp.
Sau đây, chúng tôi giới thiệu cấu trúc phần mềm từ dưới lên.
Hình 1 - Cấu trúc phần mềm SINGA V3.
Mỗi trường hợp Device
, hay thiết bị, được tạo ra từ một thiết bị phần cứng, v.d GPU hay CPU. Device
quản lý bộ nhớ của cấu trúc dữ liệu, và lên kế hoạch hoạt động cho việc thực hiện, v.d, trên CUDA streams hay CPU threads. Dựa trên phần cứng và ngôn ngữ lập trình của nó, SINGA sử dụng các loại device cụ thể sau:
Hàm Tensor
class là một array đa chiều, lưu trữ biến models, như hình ảnh đầu vào và bản đồ đặc tính của convolution layer. Mỗi hàm Tensor
(v.d một tensor) được đặt trong một thiết bị, giúp quản lý bộ nhớ của tensor và lên kế hoạch (phép tính) việc thực hiện với mỗi tensor. Hầu hết phép toán trong machine learning có thể thể hiện (dày hoặc mỏng) dựa trên nghĩa và việc sử dụng tensor. Bởi vậy SINGA có thể chạy đa dạng nhiều mô hình, bao gồm deep learning và các mô hình machine learning truyền thống khác.
Có hai dạng hàm operators cho tensors, đại số tuyến tính (linear algebra) như nhân ma trận (matrix multiplication), và các hàm riêng của neural network như convolution và pooling. Các hàm đại số tuyến tính được dùng như Tensor
functions và được áp dụng riêng rẽ với các thiết bị phần cứng khác nhau.
Các toán tử neural network cụ thể cũng được sử dụng riêng rẽ như:
Thông thường, người dùng tạo một hàm Device
và sử dụng nó để tạo ra các hàm Tensor
. Khi gọi chức năng Tensor hoặc dùng trong neural network, việc thực hiện tương ứng cho thiết bị sử dụng sẽ được gọi. Nói cách khác, việc áp dụng các toán tử là rõ ràng với người dùng.
Việc dùng Tensor và Device có thể được áp dụng rộng hơn cho đa dạng thiết bị phần cứng
sử dụng ngôn ngữ lập trình. Mỗi thiết bị phần cứng mới sẽ được hỗ trợ bằng cách thêm một Device subclass mới và việc áp dụng tương ứng với các toán tử operators.
Tối ưu hoá cho tốc độ và bộ nhớ được thực hiện bởi Scheduler
và MemPool
của Device
. Ví dụ, Scheduler
tạo ra một computational graph dựa theo thư viện chương trình của toán tử operators. Sau đó nó có thể tối ưu lệnh thực hiện của toán tử trong bộ nhớ chia sẻ và song song.
Communicator
là để hỗ trợ distributed training. Nó áp dụng communication protocols sử dụng sockets, MPI và NCCL. Thường người dùng chỉ cần gọi APIs cấp cao như put()
và get()
để gửi và nhận tensors. Tối ưu hoá Communication cho cấu trúc liên kết, kích cỡ tin nhắn, v.v được thực hiện nội bộ.
Tất cả thành phần backend được thể hiện dạng Python modules thông qua SWIG. Thêm vào đó, các classes sau được thêm vào để hỗ trợ việc áp dụng cho các networks phức tạp.
Opt
và các lớp con áp dụng phương pháp (như SGD) để cập nhật các giá trị tham số model sử dụng tham số gradients. Một lớp con DistOpt đồng bộ gradients qua các workers trong distributed training bằng cách gọi phương pháp từ Communicator
.
Hàm Operator
gói nhiều functions khác nhau sử dụng toán tử Tensor hoặc neural network từ backend. Ví dụ, hàm forward function và backward function ReLU
tạo ra toán tử ReLU
operator.
Layer
và các lớp con gói các toán tử operators bằng tham số. Ví dụ, convolution và linear operators có tham số weight và bias parameters. Tham số được duy trì bởi các lớp Layer
tương ứng.
Autograd sử dụng reverse-mode automatic differentiation bằng cách ghi nhớ hoạt động của hàm forward functions của các toán tử rồi tự động gọi hàm backward functions ở chiều ngược lại. Tất cả các hàm functions có thể được hỗ trợ bởi Scheduler
để tạo ra một computational graph nhằm tối ưu hoá hiệu quả và bộ nhớ.
Model cung cấp giao diện cơ bản để thực hiện các mô hình models mới. Bạn chỉ cần dùng Model
và định nghĩa việc thực hiện forward propagation của model bằng cách tạo và gọi các layers của toán tử. Model
sẽ thực hiện autograd và tự động cập nhật tham số thông qua Opt
trong khi dữ liệu để training được bơm vào đó. Với Model
API, SINGA có nhiều lợi thế trong cả lập trình mệnh lệnh và lập trình khai báo. Người dùng sử dụng một hệ thống sử dụng Model API theo dạng lập trình mệnh lệnh như PyTorch. Khác với PyTorch tạo lại phép thực thi operations ở mỗi vòng lặp, SINGA hỗ trợ phép thực thi qua cách tạo một computational graph hàm súc (khi tính năng này được sử dụng) sau vòng lặp đầu tiên. Graph tương tự như đã được tạo bởi các thư viện sử dụng lập trình khai báo, như TensorFlow. Vì thế, SINGA có thể áp dụng các kĩ thuật tối ưu hoá bộ nhớ và tốc độ qua computational graph.
Để hỗ trợ ONNX, SINGA áp dụng một sonnx module, bao gồm: