Microsoft-CNTK2

Bộ công cụ nhận thức của Microsoft cung cấp hai phiên bản xây dựng khác nhau là chỉ dành cho CPU và chỉ dành cho GPU.

Phiên bản xây dựng chỉ dành cho CPU

Phiên bản xây dựng chỉ dành cho CPU của CNTK sử dụng Intel MKLML được tối ưu hóa, trong đó MKLML là tập hợp con của MKL (Thư viện hạt nhân toán học) và được phát hành cùng với Intel MKL-DNN dưới dạng phiên bản Intel MKL dành cho MKL-DNN đã chấm dứt.

Phiên bản chỉ xây dựng GPU

Mặt khác, phiên bản xây dựng chỉ dành cho GPU của CNTK sử dụng các thư viện NVIDIA được tối ưu hóa cao như CUB và < a i=3>cuDNN. Nó hỗ trợ đào tạo phân tán trên nhiều GPU và nhiều máy. Để đào tạo phân tán nhanh hơn nữa về CNTK, phiên bản xây dựng GPU cũng bao gồm −

Kích hoạt GPU bằng CNTK trên Windows

Ở phần trước chúng ta đã biết cách cài đặt phiên bản CNTK cơ bản để sử dụng với CPU. Bây giờ hãy thảo luận về cách chúng ta có thể cài đặt CNTK để sử dụng với GPU. Tuy nhiên, trước khi đi sâu vào vấn đề này, trước tiên bạn phải có card đồ họa được hỗ trợ.

Hiện tại, CNTK hỗ trợ card đồ họa NVIDIA có hỗ trợ CUDA 3.0 ít nhất. Để đảm bảo, bạn có thể kiểm tra tại https://developer.nvidia.com/cuda-gpus xem GPU của bạn có hỗ trợ CUDA hay không.

Vì vậy, chúng ta hãy xem các bước để kích hoạt GPU bằng CNTK trên hệ điều hành Windows –

Bước 1 − Tùy thuộc vào cạc đồ họa bạn đang sử dụng, trước tiên bạn cần có trình điều khiển GeForce hoặc Quadro mới nhất cho cạc đồ họa của mình.

Bước 2 − Sau khi tải xuống trình điều khiển, bạn cần cài đặt bộ công cụ CUDA Phiên bản 9.0 dành cho Windows từ trang web NVIDIA https:// https://developer.nvidia.com/cuda-90-download-archive?target_os=Windows&target_arch=x86_64. Sau khi cài đặt, hãy chạy trình cài đặt và làm theo hướng dẫn.

Bước 3 − Tiếp theo, bạn cần cài đặt tệp nhị phân cuDNN từ trang web NVIDIA https://developer.nvidia.com/rdp/form /cudnn-download-survey. Với phiên bản CUDA 9.0, cuDNN 7.4.1 hoạt động tốt. Về cơ bản, cuDNN là một lớp trên CUDA, được CNTK sử dụng.

Bước 4 − Sau khi tải xuống tệp nhị phân cuDNN, bạn cần giải nén tệp zip vào thư mục gốc của bản cài đặt bộ công cụ CUDA.

Bước 5 − Đây là bước cuối cùng sẽ cho phép sử dụng GPU bên trong CNTK. Thực hiện lệnh sau bên trong dấu nhắc Anaconda trên hệ điều hành Windows − pip install cntk-gpu

Kích hoạt GPU bằng CNTK trên Linux

Hãy để chúng tôi xem cách chúng tôi có thể kích hoạt GPU bằng CNTK trên hệ điều hành Linux –

Đang tải xuống bộ công cụ CUDA

Trước tiên, bạn cần cài đặt bộ công cụ CUDA từ trang web NVIDIA https://developer.nvidia.com/cuda-90-download-archive?target_os=Linux&target_arch= x86_64&target_distro=Ubuntu&target_version=1604&target_type =runfilelocal.

Chạy trình cài đặt

Bây giờ, khi bạn có các tệp nhị phân trên đĩa, hãy chạy trình cài đặt bằng cách mở một thiết bị đầu cuối và thực hiện lệnh sau cũng như hướng dẫn trên màn hình – sh cuda_9.0.176_384.81_linux-run

Sửa đổi tập lệnh hồ sơ Bash

Sau khi cài đặt bộ công cụ CUDA trên máy Linux, bạn cần sửa đổi tập lệnh cấu hình BASH. Để làm điều này, trước tiên hãy mở tệp $HOME/ .bashrc trong trình soạn thảo văn bản. Bây giờ, ở cuối tập lệnh, hãy bao gồm các dòng sau –

export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64\
${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
Installing

Cài đặt thư viện cuDNN

Cuối cùng chúng ta cần cài đặt các tệp nhị phân cuDNN. Có thể tải xuống từ trang web NVIDIA https://developer.nvidia.com/rdp/form/cudnn-download-survey. Với phiên bản CUDA 9.0, cuDNN 7.4.1 hoạt động tốt. Về cơ bản, cuDNN là một lớp trên CUDA, được CNTK sử dụng.

Sau khi tải xuống phiên bản dành cho Linux, hãy giải nén nó vào thư mục /usr/local/cuda-9.0 bằng cách sử dụng lệnh sau −< /span> tar xvzf -C /usr/local/cuda-9.0/ cudnn-9.0-linux-x64-v7.4.1.5.tgz Thay đổi đường dẫn đến tên tệp theo yêu cầu.

CNTK – Phân loại trình tự

Trong chương này, chúng ta sẽ tìm hiểu chi tiết về các trình tự trong CNTK và cách phân loại của nó.

Tenxơ

Khái niệm mà CNTK hoạt động là tensor. Về cơ bản, đầu vào, đầu ra cũng như các tham số CNTK được tổ chức dưới dạng tensors, thường được coi là một ma trận tổng quát. Mỗi tensor đều có một thứ hạng −

  • Tenxơ hạng 0 là vô hướng.
  • Tenxơ hạng 1 là một vectơ.
  • Tenxơ bậc 2 là amatrix.

Ở đây, các thứ nguyên khác nhau này được gọi là trục.

Trục tĩnh và trục động

Đúng như tên gọi, các trục tĩnh có cùng độ dài trong suốt vòng đời của mạng. Mặt khác, độ dài của trục động có thể khác nhau tùy theo từng trường hợp. Trên thực tế, độ dài của chúng thường không được biết trước khi mỗi minibatch được trình bày.

Trục động giống như trục tĩnh vì chúng cũng xác định một nhóm các số có ý nghĩa trong tensor.

Ví dụ

Để làm rõ hơn, chúng ta hãy xem một nhóm nhỏ các video clip ngắn được thể hiện như thế nào trong CNTK. Giả sử rằng độ phân giải của các video clip là 640 * 480. Và các clip cũng được quay bằng màu thường được mã hóa bằng ba kênh. Điều đó còn có nghĩa là minibatch của chúng tôi có những điều sau đây –

  • 3 trục tĩnh có chiều dài lần lượt là 640, 480 và 3.
  • Hai trục động; độ dài của video và trục minibatch.

Điều đó có nghĩa là nếu một minibatch có 16 video, mỗi video dài 240 khung hình, sẽ được biểu thị dưới dạng 16*240*3*640*480< a i=2> tensor.

Làm việc với trình tự trong CNTK

Chúng ta hãy hiểu các trình tự trong CNTK trước tiên bằng cách tìm hiểu về Mạng bộ nhớ ngắn hạn. Mạng bộ nhớ ngắn hạn dài hạn (LSTM)

Microsoft (CNTK) - CPU và GPU

Mạng bộ nhớ dài hạn (LSTM) được giới thiệu bởi Hochreiter & Schmidhuber. Nó giải quyết được vấn đề có được một lớp lặp lại cơ bản để ghi nhớ mọi thứ trong một thời gian dài. Kiến trúc của LSTM được đưa ra ở sơ đồ trên. Như chúng ta có thể thấy, nó có các nơ-ron đầu vào, các ô nhớ và các nơ-ron đầu ra. Để giải quyết vấn đề độ dốc biến mất, mạng bộ nhớ ngắn hạn dài sử dụng một ô nhớ rõ ràng (lưu trữ các giá trị trước đó) và các cổng sau –

  • Quên cổng − Đúng như tên gọi, nó báo cho ô nhớ quên các giá trị trước đó. Ô nhớ lưu trữ các giá trị cho đến khi cổng, tức là ‘quên cổng’ yêu cầu nó quên chúng.
  • Cổng đầu vào − Đúng như tên gọi, nó thêm nội dung mới vào ô.
  • Cổng đầu ra − Như tên ngụ ý, cổng đầu ra quyết định thời điểm chuyển dọc theo các vectơ từ ô sang trạng thái ẩn tiếp theo.

Rất dễ dàng để làm việc với các chuỗi trong CNTK. Hãy xem nó với sự trợ giúp của ví dụ sau –

import sys
import os
from cntk import Trainer, Axis
from cntk.io import MinibatchSource, CTFDeserializer, StreamDef, StreamDefs,\
   INFINITELY_REPEAT
from cntk.learners import sgd, learning_parameter_schedule_per_sample
from cntk import input_variable, cross_entropy_with_softmax, \
   classification_error, sequence
from cntk.logging import ProgressPrinter
from cntk.layers import Sequential, Embedding, Recurrence, LSTM, Dense
def create_reader(path, is_training, input_dim, label_dim):
   return MinibatchSource(CTFDeserializer(path, StreamDefs(
      features=StreamDef(field='x', shape=input_dim, is_sparse=True),
      labels=StreamDef(field='y', shape=label_dim, is_sparse=False)
   )), randomize=is_training,
   max_sweeps=INFINITELY_REPEAT if is_training else 1)
def LSTM_sequence_classifier_net(input, num_output_classes, embedding_dim,
LSTM_dim, cell_dim):
   lstm_classifier = Sequential([Embedding(embedding_dim),
      Recurrence(LSTM(LSTM_dim, cell_dim)),
      sequence.last,
      Dense(num_output_classes)])
return lstm_classifier(input)
def train_sequence_classifier():
   input_dim = 2000
   cell_dim = 25
   hidden_dim = 25
   embedding_dim = 50
   num_output_classes = 5
   features = sequence.input_variable(shape=input_dim, is_sparse=True)
   label = input_variable(num_output_classes)
   classifier_output = LSTM_sequence_classifier_net(
   features, num_output_classes, embedding_dim, hidden_dim, cell_dim)
   ce = cross_entropy_with_softmax(classifier_output, label)
   pe =      classification_error(classifier_output, label)
   rel_path = ("../../../Tests/EndToEndTests/Text/" +
      "SequenceClassification/Data/Train.ctf")
   path = os.path.join(os.path.dirname(os.path.abspath(__file__)), rel_path)
   reader = create_reader(path, True, input_dim, num_output_classes)
input_map = {
   features: reader.streams.features,
   label: reader.streams.labels
}
lr_per_sample = learning_parameter_schedule_per_sample(0.0005)
progress_printer = ProgressPrinter(0)
trainer = Trainer(classifier_output, (ce, pe),
sgd(classifier_output.parameters, lr=lr_per_sample),progress_printer)
minibatch_size = 200
for i in range(255):
   mb = reader.next_minibatch(minibatch_size, input_map=input_map)
trainer.train_minibatch(mb)
   evaluation_average = float(trainer.previous_minibatch_evaluation_average)
   loss_average = float(trainer.previous_minibatch_loss_average)
return evaluation_average, loss_average
if __name__ == '__main__':
   error, _ = train_sequence_classifier()
   print(" error: %f" % error)

average  since  average  since  examplesloss     last   metric   last

error: 0.333333

Giải thích chi tiết về chương trình trên sẽ được đề cập trong các phần tiếp theo, đặc biệt là khi chúng ta xây dựng mạng nơ-ron tái phát.

xem thêm : CNTK – Mô hình hồi quy logistic

Để lại một bình luận