Thông tin về lớp học lập trình này
1. Tổng quan
TPU rất nhanh. Luồng dữ liệu huấn luyện phải bắt kịp tốc độ huấn luyện. Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách tải dữ liệu từ GCS bằng tf.data.Dataset API để cấp dữ liệu cho TPU.
Phòng thí nghiệm này là Phần 1 của "Keras on TPU" (Keras trên TPU) loạt phim. Bạn có thể thực hiện các bước này theo thứ tự sau hoặc riêng lẻ.
- [LAB NÀY] Quy trình dữ liệu tốc độ TPU: tf.data.Dataset và TFRecords
- Mô hình Keras đầu tiên của bạn có công nghệ học chuyển
- Mạng nơron tích chập, với Keras và TPU
- Convnet hiện đại, Chromiumnet, Xception, với Keras và TPU
Kiến thức bạn sẽ học được
- Cách sử dụng API tf.data.Dataset để tải dữ liệu huấn luyện
- Sử dụng định dạng TFRecord để tải dữ liệu huấn luyện một cách hiệu quả từ GCS
Phản hồi
Nếu bạn thấy có thiếu sót trong lớp học lập trình này, vui lòng cho chúng tôi biết. Bạn có thể cung cấp ý kiến phản hồi thông qua các vấn đề trên GitHub [ feedback link].
2. Bắt đầu nhanh với Google Colaboratory
Phòng thí nghiệm này sử dụng tính năng Cộng tác của Google và bạn không cần phải thiết lập. Colaboratory là một nền tảng sổ tay trực tuyến dành cho mục đích giáo dục. Công cụ này cung cấp chương trình đào tạo miễn phí về CPU, GPU và TPU.
Bạn có thể mở sổ tay mẫu này và xem qua một số ô để làm quen với Colaboratory.
Chọn phần phụ trợ TPU
Trong trình đơn Colab, hãy chọn Thời gian chạy > Thay đổi loại thời gian chạy rồi chọn TPU. Trong lớp học lập trình này, bạn sẽ sử dụng một TPU (Bộ xử lý cảm biến) mạnh mẽ được hỗ trợ để huấn luyện có tăng tốc phần cứng. Kết nối với môi trường thời gian chạy sẽ tự động diễn ra trong lần thực thi đầu tiên, hoặc bạn có thể dùng tính năng "Kết nối" ở góc trên bên phải.
Thực thi trên sổ tay
Thực thi lần lượt từng ô bằng cách nhấp vào một ô và sử dụng Shift-ENTER. Bạn cũng có thể chạy toàn bộ sổ tay bằng Thời gian chạy > Chạy tất cả
Mục lục
Tất cả sổ tay đều có mục lục. Bạn có thể mở mục này bằng mũi tên màu đen ở bên trái.
Các ô bị ẩn
Một số ô sẽ chỉ hiển thị tiêu đề. Đây là một tính năng của sổ tay dành riêng cho Colab. Bạn có thể nhấp đúp vào chúng để xem mã bên trong nhưng thường không được thú vị lắm. Thường có các hàm hỗ trợ hoặc trực quan hoá. Bạn vẫn cần phải chạy các ô này để các hàm bên trong được xác định.
Xác thực
Colab có thể truy cập vào bộ chứa riêng tư của bạn trong Google Cloud Storage, miễn là bạn xác thực bằng một tài khoản được uỷ quyền. Đoạn mã trên sẽ kích hoạt quá trình xác thực.
3. [THÔNG TIN] Đơn vị xử lý Tensor là gì?
Tóm tắt
Mã để huấn luyện một mô hình trên TPU trong Keras (và quay lại sử dụng GPU hoặc CPU nếu không có TPU):
try: # detect TPUs
tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines
# use TPUStrategy scope to define model
with strategy.scope():
model = tf.keras.Sequential( ... )
model.compile( ... )
# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)
Hôm nay, chúng tôi sẽ dùng TPU để xây dựng và tối ưu hoá thuật toán phân loại hoa với tốc độ tương tác (số phút mỗi lượt chạy huấn luyện).
Tại sao nên chọn TPU?
Các GPU hiện đại được sắp xếp dựa trên các "lõi" có thể lập trình được, một cấu trúc rất linh hoạt cho phép chúng xử lý nhiều tác vụ như kết xuất 3D, học sâu, mô phỏng vật lý, v.v. Mặt khác, TPU sẽ ghép nối một bộ xử lý vectơ cổ điển với đơn vị nhân ma trận chuyên dụng và vượt trội ở bất kỳ nhiệm vụ nào mà các phép nhân ma trận lớn chiếm ưu thế, chẳng hạn như mạng nơron.
Hình minh hoạ: một lớp mạng nơron dày đặc dưới dạng phép nhân ma trận, với một loạt 8 hình ảnh được xử lý thông qua mạng nơron cùng một lúc. Vui lòng thực hiện phép nhân một dòng x cột để xác minh rằng hàm này thực sự đang tính tổng tất cả giá trị pixel của một hình ảnh có trọng số. Lớp tích chập cũng có thể được biểu diễn dưới dạng phép nhân ma trận mặc dù quy trình này phức tạp hơn một chút ( phần giải thích ở đây, trong phần 1).
Phần cứng
MXU và VPU
Lõi TPU v2 được tạo thành từ Đơn vị nhân ma trận (MXU) chạy phép nhân ma trận và Bộ xử lý vectơ (VPU) cho tất cả các tác vụ khác như kích hoạt, mềm tối đa, v.v. VPU xử lý các phép tính float32 và int32. Mặt khác, MXU hoạt động ở định dạng dấu phẩy động 16-32 bit có độ chính xác hỗn hợp.
Dấu phẩy động có độ chính xác kết hợp và bfloat16
MXU tính các phép nhân ma trận bằng cách sử dụng đầu vào bfloat16 và đầu ra float32. Việc tích luỹ trung gian được thực hiện với độ chính xác float32.
Quá trình huấn luyện mạng nơron thường có khả năng chống lại tiếng ồn do độ chính xác của dấu phẩy động giảm. Có những trường hợp mà nhiễu thậm chí còn giúp trình tối ưu hoá hội tụ. Độ chính xác của dấu phẩy động 16 bit theo truyền thống đã được sử dụng để tăng tốc tính toán nhưng các định dạng float16 và float32 có phạm vi rất khác nhau. Việc giảm độ chính xác từ float32 xuống float16 thường dẫn đến hiện tượng tràn qua và chạy dưới luồng. Đã có các giải pháp nhưng thường bạn cần thực hiện thêm một số thao tác để float16 hoạt động.
Đó là lý do Google giới thiệu định dạng bfloat16 trong TPU. bfloat16 là float32 bị cắt bớt với chính xác các bit và phạm vi số mũ giống như float32. Điều này thêm vào thực tế là các phép nhân ma trận tính toán của TPU với độ chính xác hỗn hợp với đầu vào bfloat16 nhưng đầu ra float32, có nghĩa là thường không cần thay đổi mã để hưởng lợi từ mức tăng hiệu suất khi độ chính xác giảm.
Mảng tâm thu
MXU triển khai phép nhân ma trận trong phần cứng bằng cách sử dụng cái gọi là "mảng tâm thu" cấu trúc trong đó các phần tử dữ liệu chuyển qua một mảng gồm các đơn vị tính toán phần cứng. (Trong y học, "tâm thu" dùng để chỉ các cơn co thắt tim và lưu lượng máu, đây là dòng dữ liệu.)
Phần tử cơ bản của phép nhân ma trận là tích dấu chấm giữa một đường của một ma trận và một cột của ma trận khác (xem hình minh hoạ ở đầu phần này). Đối với phép nhân ma trận Y=X*W, một phần tử của kết quả sẽ là:
Y[2,0] = X[2,0]*W[0,0] + X[2,1]*W[1,0] + X[2,2]*W[2,0] + ... + X[2,n]*W[n,0]
Trên GPU, người ta sẽ lập trình sản phẩm chấm này thành một "lõi" GPU rồi thực thi trên bao nhiêu "lõi" song song để thử và tính toán mọi giá trị của ma trận thu được cùng một lúc. Nếu ma trận thu được có kích thước lớn 128x128, thì điều đó sẽ yêu cầu 128x128=16K "lõi" sẵn có mà thường không thể có. Các GPU lớn nhất có khoảng 4.000 lõi. Mặt khác, TPU sử dụng phần cứng tối thiểu cho các đơn vị điện toán trong MXU: chỉ bfloat16 x bfloat16 => float32
bộ tích luỹ, không có gì khác. Chúng nhỏ đến mức một TPU có thể triển khai 16K trong số đó ở MXU 128x128 và xử lý phép nhân ma trận này trong một lần.
Hình minh hoạ: mảng tâm thu MXU. Các phần tử điện toán là các giá trị tích luỹ nhân. Các giá trị của một ma trận được tải vào mảng (các chấm màu đỏ). Các giá trị của ma trận khác đi qua mảng (các chấm màu xám). Các đường dọc sẽ truyền giá trị lên trên. Các đường ngang truyền tổng một phần. Bên phải là một bài tập dành cho người dùng để xác minh rằng khi dữ liệu di chuyển qua mảng, bạn sẽ nhận được kết quả của phép nhân ma trận ở phía bên phải.
Ngoài ra, trong khi các tích vô hướng được tính trong một MXU, các tổng trung gian chỉ trao đổi qua lại giữa các đơn vị điện toán liền kề. Chúng không cần được lưu trữ và truy xuất vào/từ bộ nhớ hoặc thậm chí không cần tệp đăng ký. Kết quả cuối cùng là kiến trúc mảng tâm thu TPU có lợi thế đáng kể về mật độ và năng lượng, cũng như lợi thế tốc độ không nhỏ so với GPU khi tính toán các phép nhân ma trận.
TPU đám mây
Khi bạn yêu cầu " Cloud TPU phiên bản 2" trên Google Cloud Platform, bạn sẽ nhận được một máy ảo (VM) có bảng TPU gắn PCI. Bảng TPU có bốn chip TPU lõi kép. Mỗi lõi TPU có một VU (Bộ xử lý vectơ) và một Đơn vị nhân matriX (MatriX nhân) 128x128. "Cloud TPU" này thường được kết nối qua mạng với máy ảo đã yêu cầu. Do đó, toàn bộ thông tin sẽ có dạng như sau:
Hình minh hoạ: máy ảo có một "Cloud TPU" kết nối mạng trình tăng tốc. "Cloud TPU" một chiếc máy ảo được trang bị một bo mạch TPU gắn PCI với 4 chip TPU lõi kép.
Nhóm TPU
Trong các trung tâm dữ liệu của Google, TPU được kết nối với một kết nối điện toán hiệu suất cao (HPC). Nhờ vậy, chúng có thể xuất hiện như một trình tăng tốc rất lớn. Google gọi chúng là các nhóm và chúng có thể bao gồm tối đa 512 lõi TPU v2 hoặc 2048 lõi TPU v3.
Hình minh hoạ: một nhóm TPU phiên bản 3. Các bo mạch và giá đỡ TPU được kết nối thông qua kết nối HPC.
Trong quá trình huấn luyện, độ dốc được trao đổi giữa các nhân TPU bằng cách sử dụng thuật toán all-reduce ( giải thích rõ về all-reduce ở đây). Mô hình đang được huấn luyện có thể tận dụng phần cứng bằng cách huấn luyện các lô có kích thước lớn.
Hình minh hoạ: đồng bộ hoá độ dốc trong quá trình huấn luyện bằng thuật toán giảm tất cả trên mạng HPC lưới 2-D của Google TPU.
Phần mềm
Đào tạo theo lô lớn
Kích thước lô lý tưởng cho TPU là 128 mục dữ liệu trên mỗi lõi TPU, nhưng phần cứng đã có thể cho thấy khả năng sử dụng tốt từ 8 mục dữ liệu trên mỗi lõi TPU. Hãy nhớ rằng một Cloud TPU có 8 nhân.
Trong lớp học lập trình này, chúng ta sẽ sử dụng Keras API. Trong Keras, lô mà bạn chỉ định là kích thước lô chung cho toàn bộ TPU. Các lô của bạn sẽ tự động được chia thành 8 và chạy trên 8 lõi của TPU.
Để biết thêm các mẹo về hiệu suất, hãy xem Hướng dẫn về hiệu suất của TPU. Đối với kích thước lô rất lớn, có thể bạn cần đặc biệt chú ý trong một số mô hình. Hãy xem bài viết LARSOptimizer để biết thêm thông tin chi tiết.
Nâng cao: XLA
Các chương trình Tensorflow xác định các đồ thị tính toán. TPU không trực tiếp chạy mã Python mà chạy biểu đồ tính toán do chương trình Tensorflow của bạn xác định. Trong trường hợp này, một trình biên dịch có tên là XLA (trình biên dịch Đại số tuyến tính tăng tốc) sẽ biến đổi đồ thị Tensorflow của các nút tính toán thành mã máy TPU. Trình biên dịch này cũng thực hiện nhiều hoạt động tối ưu hoá nâng cao cho mã và bố cục bộ nhớ của bạn. Quá trình biên dịch tự động diễn ra khi công việc được gửi đến TPU. Bạn không cần phải đưa XLA vào chuỗi bản dựng của mình một cách rõ ràng.
Hình minh hoạ: để chạy trên TPU, trước tiên, biểu đồ tính toán do chương trình Tensorflow xác định sẽ được dịch sang biểu diễn XLA (trình biên dịch đại số tuyến tính tăng tốc), sau đó được XLA biên dịch thành mã máy TPU.
Sử dụng TPU trong Keras
TPU được hỗ trợ thông qua API Keras kể từ Tensorflow 2.1. Tính năng hỗ trợ của Keras hoạt động trên các nhóm TPU và TPU. Sau đây là một ví dụ hoạt động trên TPU, GPU và CPU:
try: # detect TPUs
tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines
# use TPUStrategy scope to define model
with strategy.scope():
model = tf.keras.Sequential( ... )
model.compile( ... )
# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)
Trong đoạn mã này:
TPUClusterResolver().connect()
tìm thấy TPU trên mạng. API này hoạt động mà không cần tham số trên hầu hết hệ thống của Google Cloud (công việc của Nền tảng AI, Colaboratory, Kubeflow, máy ảo học sâu được tạo thông qua tiện ích "ctpu up"). Những hệ thống này biết được TPU của chúng ở đâu nhờ một biến môi trường TPU_NAME. Nếu bạn tạo TPU theo cách thủ công, hãy thiết lập môi trường TPU_NAME. biến thể trên máy ảo bạn đang dùng hoặc gọiTPUClusterResolver
với các tham số rõ ràng:TPUClusterResolver(tp_uname, zone, project)
TPUStrategy
là bộ phận triển khai quy trình phân phối và tính năng "all-reduce" thuật toán đồng bộ hoá độ dốc.- Chiến lược được áp dụng theo phạm vi. Mô hình phải được xác định trong phạm vi chiến lược().
- Hàm
tpu_model.fit
cần một đối tượng tf.data.Dataset làm dữ liệu đầu vào để huấn luyện TPU.
Các thao tác phổ biến khi chuyển TPU
- Mặc dù có nhiều cách tải dữ liệu trong mô hình Tensorflow, nhưng đối với TPU, bạn bắt buộc phải sử dụng API
tf.data.Dataset
. - TPU rất nhanh và việc nhập dữ liệu thường trở thành điểm tắc nghẽn khi chạy trên chúng. Bạn có thể sử dụng các công cụ để phát hiện điểm tắc nghẽn về dữ liệu và các mẹo khác về hiệu suất trong Hướng dẫn về hiệu suất của TPU.
- Số int8 hoặc int16 được coi là int32. TPU không có phần cứng số nguyên hoạt động trên 32 bit.
- Một số thao tác Tensorflow không được hỗ trợ. Danh sách này có tại đây. Tin vui là giới hạn này chỉ áp dụng cho mã huấn luyện, tức là truyền tiến và lùi thông qua mô hình của bạn. Bạn vẫn có thể sử dụng tất cả thao tác Tensorflow trong quy trình nhập dữ liệu vì thao tác này sẽ được thực thi trên CPU.
tf.py_func
không được hỗ trợ trên TPU.
4. Đang tải dữ liệu
Chúng ta sẽ làm việc với một tập dữ liệu gồm các hình ảnh hoa. Mục tiêu là tìm hiểu để phân loại chúng thành 5 loại hoa. Quá trình tải dữ liệu được thực hiện bằng API tf.data.Dataset
. Trước tiên, hãy cùng tìm hiểu về API này.
Thực hành
Vui lòng mở sổ tay dưới đây, thực thi các ô (Shift-ENTER) và làm theo hướng dẫn ở bất cứ nơi nào bạn thấy "YÊU CẦU CÔNG VIỆC" .
Fun with tf.data.Dataset (playground).ipynb
Thông tin khác
Giới thiệu về từ khoá "hoa" tập dữ liệu
Tập dữ liệu này được sắp xếp trong 5 thư mục. Mỗi thư mục đều chứa một loại hoa. Các thư mục này có tên là hoa hướng dương, hoa cúc, hoa bồ công anh, hoa tulip và hoa hồng. Dữ liệu được lưu trữ trong bộ chứa công khai trên Google Cloud Storage. Trích:
gs://flowers-public/sunflowers/5139971615_434ff8ed8b_n.jpg
gs://flowers-public/daisy/8094774544_35465c1c64.jpg
gs://flowers-public/sunflowers/9309473873_9d62b9082e.jpg
gs://flowers-public/dandelion/19551343954_83bb52f310_m.jpg
gs://flowers-public/dandelion/14199664556_188b37e51e.jpg
gs://flowers-public/tulips/4290566894_c7f061583d_m.jpg
gs://flowers-public/roses/3065719996_c16ecd5551.jpg
gs://flowers-public/dandelion/8168031302_6e36f39d87.jpg
gs://flowers-public/sunflowers/9564240106_0577e919da_n.jpg
gs://flowers-public/daisy/14167543177_cd36b54ac6_n.jpg
Tại sao nên chọn tf.data.Dataset?
Keras và Tensorflow chấp nhận Tập dữ liệu trong tất cả các chức năng huấn luyện và đánh giá. Sau khi bạn tải dữ liệu trong Tập dữ liệu, API này sẽ cung cấp tất cả các chức năng phổ biến hữu ích cho dữ liệu huấn luyện mạng nơron:
dataset = ... # load something (see below)
dataset = dataset.shuffle(1000) # shuffle the dataset with a buffer of 1000
dataset = dataset.cache() # cache the dataset in RAM or on disk
dataset = dataset.repeat() # repeat the dataset indefinitely
dataset = dataset.batch(128) # batch data elements together in batches of 128
AUTOTUNE = tf.data.AUTOTUNE
dataset = dataset.prefetch(AUTOTUNE) # prefetch next batch(es) while training
Bạn có thể tìm thấy các mẹo về hiệu suất và các phương pháp hay nhất về Tập dữ liệu trong bài viết này. Tài liệu tham khảo tại đây.
Thông tin cơ bản về tf.data.Dataset
Dữ liệu thường có trong nhiều tệp, ở đây là hình ảnh. Bạn có thể tạo tập dữ liệu tên tệp bằng cách gọi:
filenames_dataset = tf.data.Dataset.list_files('gs://flowers-public/*/*.jpg')
# The parameter is a "glob" pattern that supports the * and ? wildcards.
Sau đó bạn "lập bản đồ" một hàm cho mỗi tên tệp thường sẽ tải và giải mã tệp thành dữ liệu thực tế trong bộ nhớ:
def decode_jpeg(filename):
bits = tf.io.read_file(filename)
image = tf.io.decode_jpeg(bits)
return image
image_dataset = filenames_dataset.map(decode_jpeg)
# this is now a dataset of decoded images (uint8 RGB format)
Cách lặp lại trên một Tập dữ liệu:
for data in my_dataset:
print(data)
Tập dữ liệu của các bộ dữ liệu
Trong phương pháp học có giám sát, một tập dữ liệu huấn luyện thường bao gồm các cặp dữ liệu huấn luyện và câu trả lời đúng. Để cho phép điều này, hàm giải mã có thể trả về các bộ dữ liệu. Sau đó, bạn sẽ có một tập dữ liệu gồm các bộ dữ liệu (tuple) và các bộ dữ liệu (tuple) sẽ được trả về khi bạn lặp lại thao tác này. Các giá trị được trả về là các tensor Tensorflow sẵn sàng để mô hình của bạn sử dụng. Bạn có thể gọi .numpy()
trên chúng để xem các giá trị thô:
def decode_jpeg_and_label(filename):
bits = tf.read_file(filename)
image = tf.io.decode_jpeg(bits)
label = ... # extract flower name from folder name
return image, label
image_dataset = filenames_dataset.map(decode_jpeg_and_label)
# this is now a dataset of (image, label) pairs
for image, label in dataset:
print(image.numpy().shape, label.numpy())
Kết luận:việc tải từng hình ảnh một cách nhanh chóng!
Khi lặp lại trên tập dữ liệu này, bạn sẽ thấy rằng bạn có thể tải khoảng 1-2 hình ảnh mỗi giây. Quá chậm! Các trình tăng tốc phần cứng mà chúng tôi dùng để huấn luyện có thể duy trì tốc độ này gấp nhiều lần so với trước đây. Hãy chuyển đến phần tiếp theo để xem cách chúng tôi đạt được mục tiêu này.
Giải pháp
Đây là sổ tay giải pháp. Bạn có thể sử dụng nếu gặp khó khăn.
Fun with tf.data.Dataset (solution).ipynb
Nội dung đã đề cập
- 🤔 tf.data.Dataset.list_files
- 🤔 tf.data.Dataset.map
- 🤔 Tập dữ liệu của các bộ dữ liệu
- 😀 lặp lại qua Tập dữ liệu
Vui lòng dành chút thời gian để xem danh sách kiểm tra này trong đầu bạn.
5. Tải dữ liệu nhanh
Các trình tăng tốc phần cứng của Bộ xử lý Tensor (TPU) mà chúng ta sẽ sử dụng trong phòng thí nghiệm này có tốc độ rất nhanh. Thách thức thường gặp phải là cấp cho họ dữ liệu đủ nhanh để khiến họ bận rộn. Google Cloud Storage (GCS) có khả năng duy trì thông lượng rất cao, nhưng cũng giống như tất cả các hệ thống lưu trữ đám mây, việc bắt đầu kết nối sẽ làm hao tổn mạng qua lại. Do đó, việc lưu trữ dữ liệu của chúng tôi dưới dạng hàng nghìn tệp riêng lẻ không phải là điều lý tưởng. Chúng ta sẽ phân lô theo số lượng tệp nhỏ hơn và sử dụng sức mạnh của tf.data.Dataset để đọc song song từ nhiều tệp.
Đọc hết
Đoạn mã tải các tệp hình ảnh, đổi kích thước thành một kích thước thông thường rồi lưu trữ chúng trong 16 tệp TFRecord nằm trong sổ tay dưới đây. Vui lòng đọc nhanh qua nội dung này. Bạn không cần thực thi vì dữ liệu được định dạng đúng cách của TFRecord sẽ được cung cấp cho những phần còn lại của lớp học lập trình.
Flower pictures to TFRecords.ipynb
Bố cục dữ liệu lý tưởng để lưu lượng tối ưu của GCS
Định dạng tệp TFRecord
Định dạng tệp ưu tiên của Tensorflow để lưu trữ dữ liệu là định dạng TFRecord dựa trên protobuf. Các định dạng chuyển đổi tuần tự khác cũng sẽ hoạt động, nhưng bạn có thể tải trực tiếp tập dữ liệu từ các tệp TFRecord bằng cách ghi:
filenames = tf.io.gfile.glob(FILENAME_PATTERN)
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.map(...) # do the TFRecord decoding here - see below
Để có hiệu suất tối ưu, bạn nên sử dụng mã phức tạp hơn sau đây để đọc từ nhiều tệp TFRecord cùng một lúc. Mã này sẽ đọc song song từ N tệp và bỏ qua thứ tự dữ liệu để ưu tiên tốc độ đọc.
AUTOTUNE = tf.data.AUTOTUNE
ignore_order = tf.data.Options()
ignore_order.experimental_deterministic = False
filenames = tf.io.gfile.glob(FILENAME_PATTERN)
dataset = tf.data.TFRecordDataset(filenames, num_parallel_reads=AUTOTUNE)
dataset = dataset.with_options(ignore_order)
dataset = dataset.map(...) # do the TFRecord decoding here - see below
Bản tóm tắt về TFRecord
Có thể lưu trữ ba loại dữ liệu trong TFRecords: chuỗi byte (danh sách byte), số nguyên 64 bit và số thực có độ chính xác đơn 32 bit. Các mục này luôn được lưu trữ dưới dạng danh sách, một phần tử dữ liệu sẽ là danh sách có kích thước 1. Bạn có thể sử dụng các hàm trợ giúp sau để lưu trữ dữ liệu vào TFRecords.
ghi chuỗi byte
# warning, the input is a list of byte strings, which are themselves lists of bytes
def _bytestring_feature(list_of_bytestrings):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=list_of_bytestrings))
viết số nguyên
def _int_feature(list_of_ints): # int64
return tf.train.Feature(int64_list=tf.train.Int64List(value=list_of_ints))
dấu phẩy động
def _float_feature(list_of_floats): # float32
return tf.train.Feature(float_list=tf.train.FloatList(value=list_of_floats))
viết TFRecord, sử dụng trình trợ giúp ở trên
# input data in my_img_bytes, my_class, my_height, my_width, my_floats
with tf.python_io.TFRecordWriter(filename) as out_file:
feature = {
"image": _bytestring_feature([my_img_bytes]), # one image in the list
"class": _int_feature([my_class]), # one class in the list
"size": _int_feature([my_height, my_width]), # fixed length (2) list of ints
"float_data": _float_feature(my_floats) # variable length list of floats
}
tf_record = tf.train.Example(features=tf.train.Features(feature=feature))
out_file.write(tf_record.SerializeToString())
Để đọc dữ liệu của TFRecords, trước tiên bạn phải khai báo bố cục của các bản ghi mà bạn đã lưu trữ. Trong phần khai báo, bạn có thể truy cập vào bất kỳ trường nào được đặt tên dưới dạng danh sách độ dài cố định hoặc danh sách độ dài thay đổi:
đọc từ TFRecords
def read_tfrecord(data):
features = {
# tf.string = byte string (not text string)
"image": tf.io.FixedLenFeature([], tf.string), # shape [] means scalar, here, a single byte string
"class": tf.io.FixedLenFeature([], tf.int64), # shape [] means scalar, i.e. a single item
"size": tf.io.FixedLenFeature([2], tf.int64), # two integers
"float_data": tf.io.VarLenFeature(tf.float32) # a variable number of floats
}
# decode the TFRecord
tf_record = tf.io.parse_single_example(data, features)
# FixedLenFeature fields are now ready to use
sz = tf_record['size']
# Typical code for decoding compressed images
image = tf.io.decode_jpeg(tf_record['image'], channels=3)
# VarLenFeature fields require additional sparse.to_dense decoding
float_data = tf.sparse.to_dense(tf_record['float_data'])
return image, sz, float_data
# decoding a tf.data.TFRecordDataset
dataset = dataset.map(read_tfrecord)
# now a dataset of triplets (image, sz, float_data)
Đoạn mã hữu ích:
đọc các phần tử dữ liệu đơn lẻ
tf.io.FixedLenFeature([], tf.string) # for one byte string
tf.io.FixedLenFeature([], tf.int64) # for one int
tf.io.FixedLenFeature([], tf.float32) # for one float
đọc danh sách các phần tử có kích thước cố định
tf.io.FixedLenFeature([N], tf.string) # list of N byte strings
tf.io.FixedLenFeature([N], tf.int64) # list of N ints
tf.io.FixedLenFeature([N], tf.float32) # list of N floats
đọc một số lượng mục dữ liệu có thể thay đổi
tf.io.VarLenFeature(tf.string) # list of byte strings
tf.io.VarLenFeature(tf.int64) # list of ints
tf.io.VarLenFeature(tf.float32) # list of floats
VarLenFeature trả về một vectơ thưa thớt và bạn cần thực hiện thêm một bước sau khi giải mã TFRecord:
dense_data = tf.sparse.to_dense(tf_record['my_var_len_feature'])
Cũng có thể có các trường tuỳ chọn trong TFRecords. Nếu bạn chỉ định giá trị mặc định khi đọc một trường, thì giá trị mặc định sẽ được trả về thay vì lỗi nếu thiếu trường đó.
tf.io.FixedLenFeature([], tf.int64, default_value=0) # this field is optional
Nội dung đã đề cập
- 🤔 phân đoạn các tệp dữ liệu để truy cập nhanh từ GCS
- 😓 cách ghi TFRecord. (Bạn đã quên cú pháp? Được rồi, hãy đánh dấu trang này làm bản tóm tắt)
- 🤔 tải Tập dữ liệu từ TFRecords bằng TFRecordDataset
Vui lòng dành chút thời gian để xem danh sách kiểm tra này trong đầu bạn.
6. Xin chúc mừng!
Giờ đây, bạn có thể cấp dữ liệu cho TPU. Vui lòng chuyển đến phòng thí nghiệm tiếp theo
- [LAB NÀY] Quy trình dữ liệu tốc độ TPU: tf.data.Dataset và TFRecords
- Mô hình Keras đầu tiên của bạn có công nghệ học chuyển
- Mạng nơron tích chập, với Keras và TPU
- Convnet hiện đại, Chromiumnet, Xception, với Keras và TPU
TPU trong thực tế
TPU và GPU có trên Cloud AI Platform:
- Máy ảo học sâu
- Trong mục Sổ tay dựa trên nền tảng AI
- Trong việc làm Đào tạo nền tảng AI
Cuối cùng, chúng tôi rất mong nhận được ý kiến phản hồi của bạn. Vui lòng cho chúng tôi biết nếu bạn thấy có gì thiếu trong phòng thí nghiệm này hoặc nếu bạn cho rằng điều đó cần được cải thiện. Bạn có thể cung cấp ý kiến phản hồi thông qua các vấn đề trên GitHub [ feedback link].
|