天天看點

簡化TensorFlow和Spark互操作性:LinkedIn開源Spark-TFRecord

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

TensorFlow 是市場上最流行的深度學習架構,而 Apache Spark 仍然是被廣泛采用的資料計算平台之一,從大型企業到初創公司都能見到它們的身影。很自然會有公司嘗試将這兩者結合起來。雖然有一些架構能夠讓 TensorFlow 适應 Spark,但互操作性挑戰的根源性往往在于資料級别上。TFRecord 是 TensorFlow 的原生資料結構,在 Apache Spark 中并不完全受支援。最近,LinkedIn 工程師開源了 Spark-TFRecord,這是一個基于 TensorFlow TFRecord 的 Spark 新的原生資料源。

LinkedIn 決定着手解決這一問題,并不令人感到驚訝。這家網際網路巨頭長期以來一直是 Spark 技術的廣泛采用者,并且也一直是 TensorFlow 和機器學習開源社群的積極貢獻者。在内部,LinkedIn 工程團隊經常嘗試在 TensorFlow 的原生 TFRecord 格式和 Spark 的内部格式(如 Avro 或 Parquet)之間實作轉換。Spark-TFRecord 項目的目标就是在 Spark 管道中提供 TFRecord 結構的原生功能。

先前的嘗試

Spark-TFRecord 并非第一個嘗試解決 Spark 和 TensorFlow 之間的資料互操作性挑戰的項目。這一方面最受歡迎的項目是 Spark 的建立者 Databricks 推廣的 Spark-Tensorflow-Connector。我們已經多次使用過 Spark-TensorFlow-Connector,并取得了不同程度的成功。從架構上講,連接配接器是 TFRecord 格式到 Spark SQL DataFrames 的一種改編。了解了這一點,Spark-TensorFlow-Connector 在關系資料通路場景中工作非常有效,但在其他用例中卻仍然非常有限,也就不足為奇了。

如果你仔細想想,TensorFlow 工作流的一個重要部分與磁盤 I/O 操作相關,而不是與資料庫通路相關。在這些場景中,開發人員在使用 Spark-TensorFlow-Connector 時仍然需要編寫相當多的代碼。此外,目前版本的 Spark-TensorFlow-Connector 仍然缺少一些重要的功能,比如在 TensorFlow 計算中經常用到的 PartitionBy。最後,這個連接配接器更像是處理 Spark SQL Data Frames 中的 TensorFlow 記錄的橋梁,而不是原生檔案格式。

考慮到這些限制,LinkedIn 工程團隊決定從一個略微不同的角度來解決 Spark-TensorFlow 的互操作性挑戰。

Spark-TFRecord

Spark-TFRecord 是 Apache Spark 的原生 TensorFlow TFRecord。具體來說,Spark-TFRecord 提供了從 Apache Spark 讀取 TFRecord 資料或向 Apache Spark 寫入 TFRecord 資料的例程。與建構連接配接器來處理 TFRecord 結構不同的是,Spark-TFRecord 建構為原生 Spark 資料集,就像 Avro、JSON 或者 Parquet 一樣。這意味着在 Spark-TFRecord 中,Spark 所有的 DataSet 和 DataFrame I/O 例程都是自動可用的。

一個值得探讨的明顯問題是,為什麼要建構一個新的資料結構,而不是簡單地對開源 Spark-TensorFlow-Connector 進行版本控制呢?嗯,看起來,要使連接配接器适應磁盤 I/O 操作,需要從根本上進行重新設計。

LinkedIn 工程團隊沒有遵循這條路線,而是決定實作一個新的 Spark FileFormat 接口,該接口從根本上來說,是為了支援磁盤 I/O 操作而設計的。新街口将使 TFRecord 原生操作适應任何 Spark DataFrame。從架構上看,Spark-TFRecord 由一系列基本建構塊組成,這些建構塊抽象出了讀 / 寫和序列化 / 反序列化例程:

  • Schema Inferencer:這是離 Spark-TensorFlow-Connector 最近的元件。
  • TFRecord Reader:該元件讀取 TFRecord 結構并将其傳遞給 TFRecord Deserializer。
  • TFRecord Writer:該元件從 TFRecord Serializer 接收 TFRecord 結構并将其寫入磁盤。
  • TFRecord Deserializer:該元件将 TFRecord 轉換為 Spark InternalRow 結構。
簡化TensorFlow和Spark互操作性:LinkedIn開源Spark-TFRecord

使用 LinkedIn 的 Spark-TFRecord 與其他 Spark 遠端資料集并沒有什麼不同。開發人員隻需包含 spark-tfrecord jar 庫,并使用傳統的 DataFrame API 讀寫 TFRecord 即可,如下代碼所示:

import org.apache.commons.io.FileUtils
import org.apache.spark.sql.{ DataFrame, Row }
import org.apache.spark.sql.catalyst.expressions.GenericRow
import org.apache.spark.sql.types._
val path = "test-output.tfrecord"
val testRows: Array[Row] = Array(
new GenericRow(Array[Any](11, 1, 23L, 10.0F, 14.0, List(1.0, 2.0), "r1")),
new GenericRow(Array[Any](21, 2, 24L, 12.0F, 15.0, List(2.0, 2.0), "r2")))
val schema = StructType(List(StructField("id", IntegerType),
                             StructField("IntegerCol", IntegerType),
                             StructField("LongCol", LongType),
                             StructField("FloatCol", FloatType),
                             StructField("DoubleCol", DoubleType),
                             StructField("VectorCol", ArrayType(DoubleType, true)),
                             StructField("StringCol", StringType)))
val rdd = spark.sparkContext.parallelize(testRows)
//Save DataFrame as TFRecords
val df: DataFrame = spark.createDataFrame(rdd, schema)
df.write.format("tfrecord").option("recordType", "Example").save(path)
//Read TFRecords into DataFrame.
//The DataFrame schema is inferred from the TFRecords if no custom schema is provided.
val importedDf1: DataFrame = spark.read.format("tfrecord").option("recordType", "Example").load(path)
importedDf1.show()
//Read TFRecords into DataFrame using custom schema
val importedDf2: DataFrame = spark.read.format("tfrecord").schema(schema).load(path)
importedDf2.show()           

對大多數組織來說,Spark 和 TensorFlow 這樣的深度學習架構之間的互操作性可能仍然是一個具有挑戰性的領域。然而,像 LinkedIn 的 Spark-TFRecord 這樣經過大規模測試的項目,無疑有助于簡化這兩種技術之間的橋梁,而這兩種技術對現代機器學習架構來說都是必不可少的。

作者介紹:

Jesus Rodriguez,Invector Labs 首席科學家、執行合夥人,在 IntoTheBlock 任 CTO。同時也是天使投資人、作家、多家軟體公司董事會成員。

【雲栖号線上課堂】每天都有産品技術專家分享!

課程位址:

https://yqh.aliyun.com/zhibo

立即加入社群,與專家面對面,及時了解課程最新動态!

【雲栖号線上課堂 社群】

https://c.tb.cn/F3.Z8gvnK

原文釋出時間:2020-06-18

本文作者:Jesus Rodriguez

本文來自:“

InfoQ

”,了解相關資訊可以關注“