簡化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 結構。

F7869CDD_C2C2_493d_95FC_596A576AE09B

使用 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 ”,瞭解相關信息可以關注“InfoQ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章