Veri toplamayı basitleştirin! Uber açık kaynak derin öğrenme dağıtılmış eğitim kitaplığı Petastorm

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 öğrenme kümesinin oluşturulması

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:

  • Bir veya daha fazla makine, merkezi veya yerel veri setlerini okur.
  • Her makine, kayıp fonksiyonunun değerini hesaplar ve model parametrelerine göre gradyanı hesaplar. GPU genellikle bu adımda kullanılır.
  • Model katsayıları, tahmini gradyanların birleştirilmesiyle güncellenir (genellikle birden fazla makine tarafından dağıtılmış bir şekilde hesaplanır).

Şekil 1: Bu derin öğrenme küme mimarisinde, merkezi bir veri kümesi kullanan üç hesaplama düğümü vardır.

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.

Basitleştirilmiş model mimari araştırması

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:

  • Veri kümesinin, belirli bir deney için sütunların ve satırların bir alt kümesini seçebilmeleri için araştırmacıların kullanabileceği verilerin bir üst kümesini içermesi gerekir.
  • Veri kümesindeki sensör verilerinin ön işlenmesi minimumda tutulmalıdır. Araştırmacıları gerçek zamanlı ön işlem yapmaya teşvik ediyoruz ve
  • Eğitim / değerlendirme prosedürünün bir parçası olarak kullanın. Çoğu durumda, bu, yeterince kullanılmayan diğer CPU'larla yapılabilir.

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:

  • Çok sayıda sürekli okumayı kolaylaştırın (HDFS / S3 ile uyumlu);
  • Tek bir sütuna hızlı erişimi destekleyin;
  • Bazı durumlarda daha hızlı satır sorgusuna izin verin;
  • Apache Spark ile mükemmel bir şekilde entegre edilmiştir ve hazır bir sorgu / işlem çerçevesi olarak kullanılabilir.

Sütunlu depolama ve Apache Parke

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.

Petastorm'a Giriş

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')
  • Materialize_dataset bağlam yöneticisi başlangıçta gerekli konfigürasyonu gerçekleştirir ve sonunda Petastorm meta verilerini yazar. Çıktı URL'si, HDFS'nin veya dosya sisteminin konumunu gösterebilir.
  • rowgroup_size_mb, Parquet sıra grubunun boyutunu (megabayt cinsinden) tanımlar.
  • row_generator, HelloWorldSchema ile eşleşen bir Python sözlüğü döndüren bir işlevdir.
  • dict_to_spark_row, HelloWorldSchema'ya göre veri türünü doğrular ve sözlüğü bir pyspark.Row nesnesine dönüştürür.

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'un Özellikleri

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:

  • Kameralar, lazer konumlayıcılar ve radarlar dahil olmak üzere otonom araçların test sürüşleri sırasında toplanan birden fazla sensör verisi sütunu.
  • Manuel olarak oluşturulan etiketler, satır alanları olarak saklanır.

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 mimarisi

Petastorm'un tasarım hedefleri şunları içerir:

  • Verilerin kodlanması ve kodunun çözülmesi, tek veri modunun tanımlanmasıyla gerçekleştirilir.
  • Makine öğrenimi çerçevesi ve saf Python kodu için kullanılabilir yüksek veri yükleme bant genişliği sağlayın.
  • Veri kümeleri oluşturmak için Apache Spark'ı dağıtılmış bir küme hesaplama çerçevesi olarak kullanın.
  • Python ve makine öğrenimi platformlarıyla hiçbir ilgisi olmayan Petastorm çekirdek bileşenlerinin uygulanması.
  • Yerel arayüz Tensorflow ve PyTorch çerçevesine sunulmuştur.
  • Etl paketi, veri kümeleri oluşturma işlevini uygular.
  • Okuyucu, eğitim ve hesaplama kodu tarafından kullanılan ana veri yükleme motorudur. Okuyucu Python'da uygulanır, herhangi bir makine öğrenimi çerçevesine (Tensorflow, Pytorch) dayanmaz ve Python nesli tarafından somutlaştırılabilir ve kullanılabilir.
  • Tensorflow ve PyTorch için adaptörler sağlayın.
  • Unischema, veri seti üretimi ve veri yükleme kodu ile referans alınabilir.

Şekil 7: Petastorm, veri seti oluşturmayı ve okumayı destekleyen bileşenler sağlar. Unischema, her ikisi tarafından da kullanılabilen ortak bir veri şeması tanımlar.

Parke Onarım

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).

Sonraki adım

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/

Serçe küçük ama iyi donanımlı, Sobro akıllı komodin hayatınızı kolaylaştırmak istiyor
önceki
"TFBOYS" "Haberleri" 190329 Yi Yang Qianxi Pekin'den Şangay'a uçtu, yırtık pantolonlu çocuk ilk kez sahneye çıktı
Sonraki
En pahalı 10 aksiyon filmi! Bu aksiyon filmlerinin prodüksiyon bütçesi çok yüksek
Tuvalete gittikten sonra dayanılmaz bir koku? LooLoo tuvalet koku giderici size temiz hava verir
Stack Overflow tahmin ediyor: Python beş yıl içinde JavaScript'i geçecek
190329 Yi Yang Qianxi Beijing, yırtık pantolonlu çocuk Şangay'a uçtu
Yeni nesil İnternet rapçileri 2pac ve The Notorious B.I.G.'ye saygı duymuyor mu?
Telecom eSIM, Apple Watch'u destekliyor, Guangzhou kullanıcıları artık deneyebilir!
Kubernetes'teki en iyi 10 uygulama
Aşağıdaki önerilen Amerikan dizileri iğrenç ve izlemek istiyor, ama kalbinizdeki en iğrenç olan hangisi?
"GOT7" "Paylaş" 190329 Duan Yien, bir dahaki sefere seksi tarzı denemek istediğini ve önümüzdeki beş yıl içinde ne olacağını merak ettiğini söyledi.
Uyarı | Jack Ma'ya: Yorgunluktan ölüme sadece 5 adım!
Samsung'un cep telefonu işi Çin'de Waterloo ile karşılaştı, Shenzhen fabrikası bir bütün olarak kaldırıldı
Mercedes-Benz petrol sızıntısı arttı! Kadın otomobil sahibi tehdit edildiğini söyledi
To Top