Planlama Editörü | Natalie
Yazar | Uber ATG
Tercüme | Cehalet
Editör | Natalie
Kaynak AI Frontline
AI Ön Cephe Kılavuzu: Son yıllarda, derin öğrenme, örüntü tanıma problemlerini çözmede kilit bir rol oynadı. Uber Advanced Technologies Group (ATG), otonom sürüş alanındaki çeşitli sorunları çözmek için derin öğrenmeyi kullanır. Modellerinin çoğu sensörlerden düzinelerce terabayt eğitim verisi gerektirir. Uber ATG araştırmacıları ve mühendisleri, algılama, tahmin ve planlama gibi birçok sorun alanında otonom sürüş teknolojilerini aktif bir şekilde destekliyor. Bu çabaları desteklemek için, araştırmacıların model deneylerine odaklanabilmeleri için veri elde etmelerini kolaylaştırmak için veri seti depolama çözümleri geliştirmeyi taahhüt ederler. Bu makale, Uber ATG tarafından geliştirilen açık kaynaklı bir veri erişim kitaplığı olan Petastorm'u tanıtacak. Bu kütüphane, doğrudan bağımsız veya dağıtılmış eğitim ve Parquet formatındaki terabayt veri setlerine dayalı derin öğrenme modeli değerlendirmesi gerçekleştirebilir. Petastorm, Tensorflow, Pytorch ve PySpark gibi Python tabanlı makine öğrenimi çerçevelerini destekler ve doğrudan Python kodunda da kullanılabilir.Derin bir modeli modern donanım üzerinde eğitmek bile zaman alıcıdır ve çoğu durumda eğitim yükünü birden fazla makineye dağıtmak gerekir. Tipik bir derin öğrenme kümesinin aşağıdaki adımları gerçekleştirmesi gerekir:
GPU'ların maliyeti göz önüne alındığında, GPU kümelerinin kullanımının artırılması gerekmektedir. Ayarlanmış veri erişim katmanı, eğitim için kullanılan verilerin her zaman GPU tarafından erişilebilir olmasını sağlayabilir, böylece GPU boşta kalmaz.
Birden çok veri kaynağından terabaytlarca senkronize edilmiş veri hazırlamak genellikle hatalara meyillidir. Araştırmacılara, her bir görev için yeni bir veri kümesi oluşturmak zorunda kalmadan çeşitli görevleri yerine getirebilmeleri için tek bir veri kümesi sağlamak istiyoruz.
Bunun için aşağıdaki ilkelere uyulmalıdır:
Endüstride, derin öğrenme uygulamaları için veri seti depolaması genellikle iki kategoriye ayrılır: çoklu dosya ve kayıt akışı veri setleri.
Çok dosyalı veri seti
Bu durumda, her tensör / resim / etiket kümesi ayrı bir dosyaya kaydedilir (örneğin, PNG, JPEG, NPZ ve CSV). Tüm veri seti, her biri çok sayıda dosya içeren bir veya daha fazla dosya sistemi dizini olarak saklanır. Dosya sayısı milyonlara ulaşabilir (örneğin, ImageNet 1,2 milyon dosyaya sahiptir). Bu formatta saklanırsa, Uber ATG'nin veri seti 100 milyon dosyayı aşacaktır.
Bu yöntem, kullanıcıların veri kümesindeki herhangi bir satırın herhangi bir sütununa rastgele erişmesine olanak tanır. Bununla birlikte, dosya sistemine çoklu gidiş gelişlerin maliyeti yüksektir, bu nedenle, özellikle HDFS ve S3 gibi modern dağıtılmış dosya sistemlerini kullanırken büyük ölçekte uygulanması zordur (bu sistemler genellikle büyük veri bloklarının hızlı okunması için optimize edilmiştir) .
Akış veri setini kaydet
Diğer bir yol, bir veri satırları koleksiyonunu birleştirmek ve bunları bir veya daha fazla dosyaya kaydetmektir. Örneğin, Tensorflow protobuf dosyalarını (TFRecord) kullanır. Diğer popüler formatlar arasında HDF5 ve Python pickle dosyaları bulunur.
Bu yöntem, HDFS ve S3 dosya sistemleri için uygundur. Ancak, belirli bir sütunun sorgulanması, tüm alanların ağ üzerinden iletilmesini gerektirir ve ardından kullanılmayan veriler atılır. Tek bir satırı sorgulamak istiyorsanız, ayrıca özel bir dizine ihtiyacınız var.
Birden fazla çözümü değerlendirdikten sonra, yukarıdaki iki yöntemin bazı eksikliklerini bir dereceye kadar ortadan kaldıran Apache Parquet depolama formatını kullanmaya karar verdik:
Sütunlu veri depolama, verileri sütun sırasına göre (satırlar yerine) düzenler. Örneğin, otonom bir aracın sensörlerinden kaydedilen veriler şöyle görünebilir:
Satır ve sütun depolama arasındaki farklar aşağıdaki gibidir:
Verilerin sütun sırasına göre depolanması, kullanıcıların yalnızca bir sütun alt kümesini yüklemelerine izin verir, böylece ağ üzerinden iletilen veri miktarını azaltır. Otonom araçlardaki sensörlerden veri toplamak için bu fayda açıktır: Deneyinizin yalnızca belirli bir kameradan görüntüleri gerektirip gerektirmediğini, aynı sıradaki 10 yüksek çözünürlüklü görüntüden yükleyebileceğinizi düşünün. Onlardan biri.
Apache Parquet, son yıllarda giderek daha popüler hale gelen sütunlu bir depolama formatıdır. Apache Spark, Apache Arrow ve diğer açık kaynaklı projeler tarafından desteklenir ve model mimarisi araştırmasını basitleştirmek için çok uygundur.
Tensorflow ve Pytorch, derin öğrenme topluluğunda yaygın olarak kullanılan çerçevelerdir. Bu çerçeveler, Parquet depolama erişimini desteklemez, bu nedenle bu boşluğu doldurmak için Petastorm'u kurduk.
Genellikle, birden çok veri kaynağından gelen kayıtların bağlanmasıyla bir veri kümesi oluşturulur. Apache Spark'ın Python arabirimi PySpark tarafından oluşturulan bu veri kümesi, daha sonra makine öğrenimi eğitiminde kullanılacaktır. Petastorm, standart Parquet'i Petastorm ile uyumlu hale getirmek üzere genişletmek için Petastorm'a özgü meta verileri kullanan basit bir işlev sağlar.
Petastorm ile verileri tüketmek, HDFS veya dosya sistemlerinde nesneleri oluşturmak ve yinelemeli olarak okumak kadar basittir. Petastorm, Parquet dosyalarını okumak için PyArrow'u kullanır.
Şekil 2: Bir veri kümesi oluşturmak için birden çok veri kaynağını tek bir tablo yapısında birleştirin. Aynı veri seti, model eğitimi ve değerlendirmesi için birden çok kez kullanılabilir.Veri seti oluştur
Veri kümelerini oluşturmak için Petastorm'u kullanmak için, kullanıcıların önce Unischema olan veri şemasını tanımlamaları gerekir. Kullanıcıların bir kalıp tanımlaması gereken tek yer burasıdır ve Petastorm onu PySpark, Tensorflow ve Python gibi diğer çerçevelerin gerektirdiği biçime dönüştürecektir.
Unischema örneği, veri kümesinin yolu kullanılarak okunabilen Parquet depolama meta verilerinde özel bir alan olarak serileştirilir.
Aşağıdaki örnek, bir Unischema örneğinin nasıl oluşturulacağını gösterir. Gerekli alan özellikleri şunları içerir: alan adı, veri türü (NumPy veri türü ile temsil edilir), çok boyutlu dizi, veri kodlama / kod çözme için kodek ve alanın boş olup olmadığını gösteren bir Boolean değeri.
HelloWorldSchema = Unischema ('HelloWorldSchema', )Petastorm veri setini yazmak için PySpark kullanıyoruz. Aşağıdaki örnek, 1000 satırlık veri oluşturmak için Petastorm'un nasıl kullanılacağını gösterir.
rows_count = 10 materialize_dataset ile (spark, output_url, HelloWorldSchema, rowgroup_size_mb): rows_rdd = sc.parallelize (aralık (rows_count)) \ .map (row_generator) \ .map (lambda x: dict_to_spark_row (HelloWorldSchema, x)) spark.createDataFrame (rows_rdd, HelloWorldSchema.as_spark_schema ()) \ .yazmak \ .parquet ('file: /// tmp / hello_world_dataset')Veri setini oku
Daha sonra, Python kodunun nasıl kullanılacağını ve yaygın olarak kullanılan iki makine öğrenimi çerçevesinde (Tensorflow ve Pytorch) veri setlerinin nasıl okunacağını özetleyeceğiz.
Python
Python kodunda, Petastorm veri kümesine erişmek için doğrudan Reader örneğini kullanabilirsiniz. Okuyucu yineleyici arayüzünü uygular, bu nedenle verileri okumak çok basittir:
Reader ile ('file: /// tmp / hello_world_dataset') okuyucu olarak: # Saf piton okuyucuda örnek için: print (sample.id) plt.imshow (sample.image1)Tensorflow
Aşağıdaki örnek, bir veri kümesinin Tensorflow'a nasıl aktarılacağını gösterir. örnekler bir demettir, anahtarı Unischema'dan gelir ve değeri bir tf.tensor nesnesidir:
Reader ile ('file: /// tmp / hello_world_dataset') okuyucu olarak: tensor = tf_tensors (okuyucu) tf.Session () ile sess: sample = sess.run (tensör) print (sample.id) plt.imshow (sample.image1)Yakın gelecekte, kullanıcılar verilere erişmek için tf.data.Dataset arayüzünü kullanabilir.
Pytorch
Petastorm veri seti, aşağıda gösterildiği gibi petastorm.pytorch.DataLoader adaptör sınıfı aracılığıyla Pytorch'a entegre edilebilir:
DataLoader ile (Reader ('file: /// tmp / hello_world_dataset')) train_loader olarak: örnek = sonraki (yineleme (tren_yükleyici)) baskı (örnek) plt.plot (örnek)Veri kümelerini analiz etmek için Spark kullanın
Spark'ın kendisi, Parquet veri formatını destekler, böylece veri kümelerini analiz etmek ve işlemek için çeşitli Spark araçlarını kullanabilirsiniz. Aşağıdaki örnek, Petastorm veri kümesinin Spark RDD nesneleri olarak nasıl okunacağını gösterir:
rdd = dataset_as_rdd ('file: /// tmp / hello_world_dataset', spark, ) baskı (rdd.first (). id)Petastorm veri kümesini işlemek için standart PySpark araçları kullanılabilir. Lütfen verilerin kodunun çözülmeyeceğini ve yalnızca Parquet biçiminde karşılık gelen yerel temsile sahip alanın değerinin (skaler gibi) anlamlı olduğunu unutmayın:
# Bir parke dosyasından bir veri çerçevesi nesnesi oluşturun dataframe = spark.read.parquet (dataset_url) # Bir şema göster dataframe.printSchema () # Hepsini say dataframe.count () # Tek bir sütun göster dataframe.select ('id']. show ()Petastorm veri setini SQL kullanarak sorgulayabilirsiniz:
number_of_rows = spark.sql ( 'SEÇİM (id)' 'parquet.` dosyasından: /// tmp / hello_world_dataset`) .collect ()Petastorm, sıra filtreleme, veri dilimleme, karıştırma, alanların alt kümelerine erişim ve zaman serisi verileri (n-gram) desteği dahil olmak üzere otonom sürüş algoritmalarının eğitimini desteklemek için çeşitli özellikler sunar.
Tipik bir veri kümesinin yapısı şunları içerir:
Sıra verileri kronolojik sıraya göre sıralanır ve aracın test çalışmalarına göre gruplanır Sıra grubu boyutu genellikle 30 ila 100 aralığındadır.
Paralel yürütme stratejisi
Petastorm, veri yükleme ve kod çözme işlemlerini paralel hale getirmek için iki strateji sağlar: biri iş parçacığı havuzuna, diğeri işlem havuzuna dayanır. Strateji seçimi, okunan veri türüne bağlıdır.
Genel olarak, satır kodlanmış yüksek çözünürlüklü görüntüler içerdiğinde, iş parçacığı havuzu stratejisi kullanılmalıdır. Bu durumda, işlem süresinin çoğu görüntünün C ++ koduyla kodunun çözülmesine harcanır. Şu anda, Python Global Yorumlayıcı Kilidi (GIL) tutulmayacaktır.
Satır küçük olduğunda, süreç havuzu stratejisi daha uygundur. Bu durumda, işlemenin çoğu Python kodu aracılığıyla yapılır. Şu anda, GIL'in neden olduğu yürütme serileştirmesinin üstesinden gelmek için birden çok işlem paralel olarak çalıştırılmalıdır.
n-gram
Bazı modeller, ortamı daha iyi açıklamak veya ortamdaki katılımcıların gelecekteki davranışlarını tahmin etmek için zamansal bağlam gerektirir.
Temel veriler zamanında düzenlenirse, Petastorm böyle bir zaman bağlamı sağlayabilir. Petastorm Reader nesnesinden bir n-gram talep ederseniz, sonraki satırlar tek bir eğitim örneğinde gruplandırılacaktır.
Aşağıdaki şekil, 3 n gram uzunluğundaki gruplandırmayı göstermektedir. AV Log # 0 ve AV Log # 1 iki farklı araç kaydını temsil eder:
Şekil 3: Bir veri setini okurken bir n-gram oluşturmak. N-gram, Parke sıra gruplarını kapsayamaz.Lütfen n-gram gruplamanın Parquet sıra gruplarını kapsayamayacağını unutmayın. Şekil 3'te, sıra-grup 0 üç n-gram üretirken, 1. sıra-grup sadece bir tane üretir ve diğer üçü 2. sıra-gruptan. n-gram, IO ve CPU bant genişliğinden tasarruf sağlar, çünkü disk verilerinin kopyalanmasına ve tekrarlanan yükleme ve kod çözme işlemlerine gerek yoktur.
N-gramlar, veri kümesinde göründükleri sırayla oluşturulur, bu nedenle kullanıcıların veri kümesindeki sırayı erişim örüntüsü ile tutarlı tutması gerekir.
Karıştır
Veri kümesi n-gram erişim modunu destekliyorsa, satır verileri zaman damgasına göre sıralanır. Parke, bir satır grubundaki tüm satırların yüklenmesini destekler. Bu nedenle, veriler oldukça alakalı bir numune setine yüklenecektir (örneğin, otonom bir aracın kamerasından alınan iki ardışık görüntü çok benzer olacaktır). Ardışık örnekler arasındaki yüksek korelasyon beklediğimiz gibi değil, eğitim algoritmasının performansını düşürecektir. Alaka düzeyini azaltmak için Petastorm, karıştırma işlevini sağlar.
Şekil 4: Karıştırma, yüklenecek sıra grubunun rastgele seçilmesi ve ardından tek tek numunelerin bellek karıştırma arabelleğine yerleştirilmesiyle gerçekleştirilir.Petastorm, veri kümesinden rastgele bir dizi satır grubu seçer. Çözülen hatlar, satır karıştırma tamponuna konur ve ardından tampondan rastgele bir satır seçilir ve kullanıcıya geri gönderilir.
Satır koşulu (filtre)
Birden çok laboratuvarda yeniden kullanılan veri kümesi örnekleri için, satır alt kümelerini etkili bir şekilde seçebilmek çok önemlidir. Petastorm satır yüklemlerini destekler. Petastorm satır koşulu, Parquet depolama bölümlerini kullanır ve yalnızca uygun sütunları yükler.
Gelecekte, sorguları daha da hızlandırmak için Parquet'in pushdown işlevini Petastorm'a entegre etmeyi planlıyoruz.
Satır grubu dizini
Petastorm, bir anahtar ve bir dizi satır grubu arasında bir eşlemenin depolanmasını destekler. Bu eşleme, belirli koşulları karşılayan satır gruplarının hızlı bir şekilde bulunmasına yardımcı olur. "Satır tahminlerinin" kullanıldığı yerlerde, ek filtreleme gereklidir.
Dağıtılmış eğitim için parçalama
Dağıtılmış bir eğitim ortamında, her süreç genellikle eğitim verilerinin bir alt kümesinden sorumludur. Bir işlemin veri alt kümesi, diğer işlemlerin veri alt kümesine ortogonaldir. Petastorm, veri kümelerinin okuma zamanı dilimlerinin ortogonal örnek kümelerine dönüştürülmesini destekler.
Şekil 5: Petastorm, dağıtılmış eğitime katılan farklı makinelere veri setinin örtüşmeyen alt kümelerini sağlar.Yerel önbellek
Petastorm, verileri yerel depolamada önbelleğe almayı destekler. Bu, ağ bağlantısı yavaş olduğunda veya bant genişliği pahalı olduğunda kullanışlıdır.
Şekil 6: Yerel önbelleğe alma etkinleştirilirse, veriler oturum başına yalnızca bir kez indirilir.İlk zaman diliminde, uzak depolamadan bir dizi örnek okunur ve yerel önbelleğe kaydedilir. Sonraki zaman diliminde, tüm veriler yerel önbellekten okunacaktır.
Petastorm'un tasarım hedefleri şunları içerir:
Spark'ı Parquet veri kümelerini yazmak için kullanmaya başladığımızda bazı sorunlarla karşılaştık. Ana neden, birkaç megabaytlık alan içeren verilerin satır boyutudur. İlk sorunumuz, veri setindeki satır grubunun beklenenden çok daha büyük olması ve yetersiz hafıza gibi sorunlara neden olmasıdır. Kodu araştırdıktan sonra, parke-mr'nin, satır grubunun kullanıcı tarafından belirlenen hedef boyuta ulaşıp ulaşmadığını kontrol etmeden önce minimum 100 satırlık bir satır grubu uyguladığını buldum. Bu soruna yanıt olarak, Parquet'in zaten ilgili bir çekme isteği vardır, bu nedenle bu kod tabanını çatallayıp sıra grubu boyutunun gereksinimlerimizi karşılaması için bazı değişiklikler yapıyoruz.
Satır grubu boyutu problemini çözdükten sonra, daha küçük satır grupları oluşturmaya veya daha büyük alanlar kullanmaya çalıştığımızda, Spark işlerinin hafızanın tükeneceğini gördük. Oluşturulan veri kümesini araştırarak, dosya meta verilerini depolayan Parquet altbilgisinin boyutunun, yeni alanlar eklendiğinde veya satır grubu boyutu azaltıldığında önemli ölçüde arttığını gördük.
Parquet'in görüntüleri temsil eden büyük ikili alanlar veya diğer çok boyutlu diziler için istatistikler ürettiği ortaya çıktı. Parquet, bu alanların minimum ve maksimum değerlerini altbilgide sakladığından, satır grubu boyutu yeterince küçükse, altbilgi, hepsini belleğe sığmayana kadar çok büyük olacaktır. Bu sorun parke-mr kod tabanında çözüldü, ancak Spark 2.1.0 kullanıyoruz (Parke 1.8.1'e bağlı olarak). Bu sorunu çözmek için Spark'ı yükselttik (bu sorun Parquet 1.8.3'te düzeltildi).
Aşağıda yakın gelecekte lanse edilmesi planlanan iyileştirmelerden bazılarını vurguluyoruz:
Karıştırmanın bellek ayak izini azaltın
Dahang Group, IO kullanımını ve veri yükleme hızını iyileştirmeye yardımcı olur. Bununla birlikte, ardışık örnekler arasındaki korelasyonu da arttırırlar. Shuffle mekanizmasını aktif olarak geliştiriyoruz.
Aşağı itme desteğini tahmin edin
Pyarrow, kısa süre içinde tahmini itme desteği sağlayacak. Daha hızlı satır filtreleme elde etmek için kullanmayı umuyoruz.
Spark ile entegrasyonu geliştirin
Spark'ta Petastorm veri kümesine erişirken, bazı işlemler beklenenden daha fazla zaman veya bellek alıyor gibi görünüyor. Büyük alanları etkili bir şekilde işleyen diğer nüansları anlamak için Parquet kitaplık kodunu daha fazla araştırmamız gerekir.
Ek depolama biçimi
Petastorm, temeldeki depolama formatını özetler. Deneyler ve veri yükleme performansı ayarlamaları için daha fazla özgürlük sağlamak için Parquet dışındaki depolama formatlarını Petastorm'a entegre edebiliriz.
GitHub açık kaynak proje portalı:
Petastorm:
parke-bay:
https://github.com/apache/parquet-mr
Orijinal İngilizce:
https://eng.uber.com/petastorm/