Model kontrol noktaları

Bir modelin durumunu kaydetme ve geri yükleme yeteneği, transfer öğrenimi veya önceden eğitilmiş modeller kullanılarak çıkarım yapılması gibi birçok uygulama için hayati öneme sahiptir. Bir modelin parametrelerini (ağırlıklar, önyargılar vb.) bir kontrol noktası dosyasına veya dizine kaydetmek, bunu başarmanın bir yoludur.

Bu modül , TensorFlow v2 formatı kontrol noktalarını yüklemek ve kaydetmek için yüksek seviyeli bir arayüzün yanı sıra bu dosya formatına yazan ve bu formattan okuyan daha düşük seviyeli bileşenler sağlar.

Basit modelleri yükleme ve kaydetme

Checkpointable protokolüne uygun olarak birçok basit model, herhangi bir ek kod gerekmeden kontrol noktalarına serileştirilebilir:

import Checkpoints
import ImageClassificationModels

extension LeNet: Checkpointable {}

var model = LeNet()

...

try model.writeCheckpoint(to: directory, name: "LeNet")

ve daha sonra aynı kontrol noktası aşağıdakiler kullanılarak okunabilir:

try model.readCheckpoint(from: directory, name: "LeNet")

Model yükleme ve kaydetmeye yönelik bu varsayılan uygulama, modeldeki her tensör için, model yapıları içindeki özelliklerin adlarına dayanan yol tabanlı bir adlandırma şeması kullanacaktır. Örneğin, LeNet-5 modelindeki ilk evrişimdeki ağırlıklar ve sapmalar sırasıyla conv1/filter ve conv1/bias adlarıyla kaydedilecektir. Yükleme sırasında kontrol noktası okuyucusu bu adlara sahip tensörleri arayacaktır.

Model yükleme ve kaydetmeyi özelleştirme

Hangi tensörlerin kaydedilip yükleneceği veya bu tensörlerin adlandırılması üzerinde daha fazla kontrole sahip olmak istiyorsanız Checkpointable protokolü birkaç özelleştirme noktası sunar.

Belirli türlerdeki özellikleri yok saymak için, modelinizde Type.property biçiminde bir dizi dizi döndüren bir ignoredTensorPaths uygulaması sağlayabilirsiniz. Örneğin, her Dikkat katmanında scale özelliğini yok saymak için ["Attention.scale"] değerini döndürebilirsiniz.

Varsayılan olarak, bir modeldeki daha derindeki her düzeyi ayırmak için eğik çizgi kullanılır. Bu, modelinize checkpointSeparator uygulanarak ve bu ayırıcı için kullanılacak yeni bir dize sağlanarak özelleştirilebilir.

Son olarak, tensör adlandırmasında en yüksek düzeyde özelleştirme için tensorNameMap uygulayabilir ve modeldeki bir tensör için oluşturulan varsayılan dize adından denetim noktasında istenen dize adına eşleyen bir işlev sağlayabilirsiniz. En yaygın olarak bu, her biri kendi adlandırma kurallarına ve model yapılarına sahip olan diğer çerçevelerle oluşturulan kontrol noktalarıyla birlikte çalışmak için kullanılacaktır. Özel bir eşleme işlevi, bu tensörlerin nasıl adlandırılacağı konusunda en yüksek düzeyde özelleştirme sağlar.

Varsayılan CheckpointWriter.identityMap (kontrol noktaları için otomatik olarak oluşturulan tensör yolu adını kullanır) veya bir sözlükten eşleme oluşturabilen CheckpointWriter.lookupMap(table:) işlevi gibi bazı standart yardımcı işlevler sağlanır.

Özel eşlemenin nasıl gerçekleştirilebileceğine dair bir örnek için lütfen OpenAI'nin kontrol noktaları için kullanılan adlandırma şemasıyla tam olarak eşleşmek üzere bir eşleme işlevi kullanan GPT-2 modeline bakın.

CheckpointReader ve CheckpointWriter bileşenleri

Denetim noktası yazımı için, Checkpointable protokolü tarafından sağlanan uzantı, bir modelin özellikleri üzerinde yineleme yapmak ve dize tensör yollarını Tensör değerlerine eşleyen bir sözlük oluşturmak için yansıma ve anahtar yolları kullanır. Bu sözlük, denetim noktasının yazılacağı bir dizinle birlikte temel bir CheckpointWriter sağlanır. Bu CheckpointWriter söz konusu sözlükten disk üzerindeki kontrol noktasını oluşturma görevini yerine getirir.

Bu sürecin tersi, CheckpointReader diskteki kontrol noktası dizininin konumunun verildiği okumadır. Daha sonra bu kontrol noktasından okur ve kontrol noktası içindeki tensörlerin adlarını kayıtlı değerleriyle eşleştiren bir sözlük oluşturur. Bu sözlük, bir modeldeki mevcut tensörleri bu sözlüktekilerle değiştirmek için kullanılır.

Hem yükleme hem de kaydetme için Checkpointable protokolü, yukarıda açıklanan eşleme işlevini kullanarak tensörlere giden dizi yollarını karşılık gelen disk üzerindeki tensör adlarıyla eşler.

Checkpointable protokolü gerekli işlevselliğe sahip değilse veya kontrol noktası yükleme ve kaydetme işlemi üzerinde daha fazla kontrol isteniyorsa CheckpointReader ve CheckpointWriter sınıfları kendi başlarına kullanılabilir.

TensorFlow v2 kontrol noktası formatı

TensorFlow v2 kontrol noktası formatı, bu başlıkta kısaca açıklandığı gibi, TensorFlow modeli kontrol noktaları için ikinci nesil formattır. Bu ikinci nesil format, 2016'nın sonlarından beri kullanılmaktadır ve v1 kontrol noktası formatına göre bir dizi iyileştirmeye sahiptir. TensorFlow SavedModel'ler, model parametrelerini kaydetmek için içlerindeki v2 kontrol noktalarını kullanır.

TensorFlow v2 kontrol noktası aşağıdaki gibi bir yapıya sahip bir dizinden oluşur:

checkpoint/modelname.index
checkpoint/modelname.data-00000-of-00002
checkpoint/modelname.data-00001-of-00002

burada ilk dosya denetim noktasının meta verilerini saklar ve geri kalan dosyalar model için serileştirilmiş parametreleri tutan ikili parçalardır.

Dizin meta veri dosyası, parçalarda bulunan tüm serileştirilmiş tensörlerin türlerini, boyutlarını, konumlarını ve dize adlarını içerir. Bu indeks dosyası, kontrol noktasının yapısal olarak en karmaşık kısmıdır ve kendisi de SSTable/LevelDB'yi temel alan tensorflow::table temel alır. Bu indeks dosyası, anahtarların dizeler ve değerlerin protokol arabellekleri olduğu bir dizi anahtar-değer çiftinden oluşur. Dizeler sıralanır ve önek sıkıştırılır. Örneğin: ilk giriş conv1/weight ve sonraki conv1/bias ise, ikinci giriş yalnızca bias kısmını kullanır.

Bu genel dizin dosyası bazen Snappy sıkıştırması kullanılarak sıkıştırılır. SnappyDecompression.swift dosyası, sıkıştırılmış bir Veri örneğinden Snappy açma işleminin yerel Swift uygulamasını sağlar.

Dizin başlığı meta verileri ve tensör meta verileri, protokol arabellekleri olarak kodlanır ve Swift Protobuf aracılığıyla doğrudan kodlanır/kodları çözülür.

CheckpointIndexReader ve CheckpointIndexWriter sınıfları, bu dizin dosyalarının yüklenmesini ve kaydedilmesini, kapsamlı CheckpointReader ve CheckpointWriter sınıflarının bir parçası olarak yönetir. İkincisi, tensör verilerini içeren yapısal olarak daha basit ikili parçalara neyin okunacağını ve bunlara ne yazılacağını belirlemek için indeks dosyalarını temel olarak kullanır.

,

Bir modelin durumunu kaydetme ve geri yükleme yeteneği, transfer öğrenimi veya önceden eğitilmiş modeller kullanılarak çıkarım yapılması gibi birçok uygulama için hayati öneme sahiptir. Bir modelin parametrelerini (ağırlıklar, önyargılar vb.) bir kontrol noktası dosyasına veya dizine kaydetmek, bunu başarmanın bir yoludur.

Bu modül , TensorFlow v2 formatı kontrol noktalarını yüklemek ve kaydetmek için yüksek seviyeli bir arayüzün yanı sıra bu dosya formatına yazan ve bu formattan okuyan daha düşük seviyeli bileşenler sağlar.

Basit modelleri yükleme ve kaydetme

Checkpointable protokolüne uygun olarak birçok basit model, herhangi bir ek kod gerekmeden kontrol noktalarına serileştirilebilir:

import Checkpoints
import ImageClassificationModels

extension LeNet: Checkpointable {}

var model = LeNet()

...

try model.writeCheckpoint(to: directory, name: "LeNet")

ve daha sonra aynı kontrol noktası aşağıdakiler kullanılarak okunabilir:

try model.readCheckpoint(from: directory, name: "LeNet")

Model yükleme ve kaydetmeye yönelik bu varsayılan uygulama, modeldeki her tensör için, model yapıları içindeki özelliklerin adlarına dayanan yol tabanlı bir adlandırma şeması kullanacaktır. Örneğin, LeNet-5 modelindeki ilk evrişimdeki ağırlıklar ve sapmalar sırasıyla conv1/filter ve conv1/bias adlarıyla kaydedilecektir. Yükleme sırasında kontrol noktası okuyucusu bu adlara sahip tensörleri arayacaktır.

Model yükleme ve kaydetmeyi özelleştirme

Hangi tensörlerin kaydedilip yükleneceği veya bu tensörlerin adlandırılması üzerinde daha fazla kontrole sahip olmak istiyorsanız Checkpointable protokolü birkaç özelleştirme noktası sunar.

Belirli türlerdeki özellikleri yok saymak için, modelinizde Type.property biçiminde bir dizi dizi döndüren bir ignoredTensorPaths uygulaması sağlayabilirsiniz. Örneğin, her Dikkat katmanında scale özelliğini yok saymak için ["Attention.scale"] değerini döndürebilirsiniz.

Varsayılan olarak, bir modeldeki daha derindeki her düzeyi ayırmak için eğik çizgi kullanılır. Bu, modelinize checkpointSeparator uygulanarak ve bu ayırıcı için kullanılacak yeni bir dize sağlanarak özelleştirilebilir.

Son olarak, tensör adlandırmasında en yüksek düzeyde özelleştirme için tensorNameMap uygulayabilir ve modeldeki bir tensör için oluşturulan varsayılan dize adından denetim noktasında istenen dize adına eşleyen bir işlev sağlayabilirsiniz. En yaygın olarak bu, her biri kendi adlandırma kurallarına ve model yapılarına sahip olan diğer çerçevelerle oluşturulan kontrol noktalarıyla birlikte çalışmak için kullanılacaktır. Özel bir eşleme işlevi, bu tensörlerin nasıl adlandırılacağı konusunda en yüksek düzeyde özelleştirme sağlar.

Varsayılan CheckpointWriter.identityMap (kontrol noktaları için otomatik olarak oluşturulan tensör yolu adını kullanır) veya bir sözlükten eşleme oluşturabilen CheckpointWriter.lookupMap(table:) işlevi gibi bazı standart yardımcı işlevler sağlanır.

Özel eşlemenin nasıl gerçekleştirilebileceğine dair bir örnek için lütfen OpenAI'nin kontrol noktaları için kullanılan adlandırma şemasıyla tam olarak eşleşmek üzere bir eşleme işlevi kullanan GPT-2 modeline bakın.

CheckpointReader ve CheckpointWriter bileşenleri

Denetim noktası yazımı için, Checkpointable protokolü tarafından sağlanan uzantı, bir modelin özellikleri üzerinde yineleme yapmak ve dize tensör yollarını Tensör değerlerine eşleyen bir sözlük oluşturmak için yansıma ve anahtar yolları kullanır. Bu sözlük, denetim noktasının yazılacağı bir dizinle birlikte temel bir CheckpointWriter sağlanır. Bu CheckpointWriter söz konusu sözlükten disk üzerindeki kontrol noktasını oluşturma görevini yerine getirir.

Bu sürecin tersi, CheckpointReader diskteki kontrol noktası dizininin konumunun verildiği okumadır. Daha sonra bu kontrol noktasından okur ve kontrol noktası içindeki tensörlerin adlarını kayıtlı değerleriyle eşleştiren bir sözlük oluşturur. Bu sözlük, bir modeldeki mevcut tensörleri bu sözlüktekilerle değiştirmek için kullanılır.

Hem yükleme hem de kaydetme için Checkpointable protokolü, yukarıda açıklanan eşleme işlevini kullanarak tensörlere giden dizi yollarını karşılık gelen disk üzerindeki tensör adlarıyla eşler.

Checkpointable protokolü gerekli işlevselliğe sahip değilse veya kontrol noktası yükleme ve kaydetme işlemi üzerinde daha fazla kontrol isteniyorsa CheckpointReader ve CheckpointWriter sınıfları kendi başlarına kullanılabilir.

TensorFlow v2 kontrol noktası formatı

TensorFlow v2 kontrol noktası formatı, bu başlıkta kısaca açıklandığı gibi, TensorFlow modeli kontrol noktaları için ikinci nesil formattır. Bu ikinci nesil format, 2016'nın sonlarından beri kullanılmaktadır ve v1 kontrol noktası formatına göre bir dizi iyileştirmeye sahiptir. TensorFlow SavedModel'ler, model parametrelerini kaydetmek için içlerindeki v2 kontrol noktalarını kullanır.

TensorFlow v2 kontrol noktası aşağıdaki gibi bir yapıya sahip bir dizinden oluşur:

checkpoint/modelname.index
checkpoint/modelname.data-00000-of-00002
checkpoint/modelname.data-00001-of-00002

burada ilk dosya denetim noktasının meta verilerini saklar ve geri kalan dosyalar model için serileştirilmiş parametreleri tutan ikili parçalardır.

Dizin meta veri dosyası, parçalarda bulunan tüm serileştirilmiş tensörlerin türlerini, boyutlarını, konumlarını ve dize adlarını içerir. Bu indeks dosyası, kontrol noktasının yapısal olarak en karmaşık kısmıdır ve kendisi de SSTable/LevelDB'yi temel alan tensorflow::table temel alır. Bu indeks dosyası, anahtarların dizeler ve değerlerin protokol arabellekleri olduğu bir dizi anahtar-değer çiftinden oluşur. Dizeler sıralanır ve önek sıkıştırılır. Örneğin: ilk giriş conv1/weight ve sonraki conv1/bias ise, ikinci giriş yalnızca bias kısmını kullanır.

Bu genel dizin dosyası bazen Snappy sıkıştırması kullanılarak sıkıştırılır. SnappyDecompression.swift dosyası, sıkıştırılmış bir Veri örneğinden Snappy açma işleminin yerel Swift uygulamasını sağlar.

Dizin başlığı meta verileri ve tensör meta verileri, protokol arabellekleri olarak kodlanır ve Swift Protobuf aracılığıyla doğrudan kodlanır/kodları çözülür.

CheckpointIndexReader ve CheckpointIndexWriter sınıfları, bu dizin dosyalarının yüklenmesini ve kaydedilmesini, kapsamlı CheckpointReader ve CheckpointWriter sınıflarının bir parçası olarak yönetir. İkincisi, tensör verilerini içeren yapısal olarak daha basit ikili parçalara neyin okunacağını ve bunlara ne yazılacağını belirlemek için indeks dosyalarını temel olarak kullanır.