SynapseML库和Apache Spark分布式计算框架深入介绍及使用教程

203 阅读9分钟

今天,我们很高兴地宣布,作为SynapseML 0.10版本的一部分,发布了一套新的用于大规模可扩展机器学习的.NET API。这使您能够从C#、F#或其他.NET系列语言中编写、训练和使用任何SynapseML模型,与我们的.NET for Apache Spark语言绑定。特别是,利用SynapseML,开发人员可以建立可扩展的智能系统,解决以下领域的挑战。

深度学习模型的可解释性
计算机视觉强化学习和个性化
异常情况检测搜索和检索
形式和人脸识别语音处理
梯度提升文本分析
微服务编排翻译

在这篇文章中,我们将首先深入了解SynapseML库和Apache Spark分布式计算框架。接下来,我们将探讨如何从.NET开始使用SynapseML。最后,我们将介绍我们的自动代码生成系统,用于将基于Scala的Apache Spark APIs映射到.NET中,以便.NET生态系统与官方的Apache Spark APIs具有同等地位。

用SynapseML进行分布式机器学习

SynapseML

编写容错的分布式程序是一个复杂和容易出错的过程。例如,考虑对一个深度网络进行分布式评估。第一步是将一个多GB的模型发送到数百个工人机器上,而不使网络不堪重负。然后,数据阅读者必须进行协调,以确保所有的数据都排队处理,并确保GPU处于满负荷状态。如果有新的计算机加入或离开集群,新的工人机器必须收到模型的副本,数据读取器需要适应与新机器分享工作,并重新计算失去的工作。最后,必须对进度进行跟踪,以确保资源被适当释放。

像Horovod这样的框架可以管理这些,但如果团队成员想与不同的ML框架进行比较,如LightGBM、XGBoost或SparkML,则需要一个新的环境和集群。此外,这些训练系统并不是为服务或部署模型而设计的,所以需要单独的推理和流媒体架构。

SynapseML简化了这种体验,它用一个单一的API统一了许多不同的ML学习框架,该API是可扩展的,与数据和语言无关,并且适用于批处理、流媒体和服务应用程序。它旨在帮助开发人员专注于他们的数据和任务的高层结构,而不是不同的ML生态系统和数据库的实施细节和特异性。

SynapseML的统一API将当今的许多工具、框架和算法标准化,简化了许多常见编程语言中的分布式ML体验。这使开发人员能够为需要一个以上框架的用例快速组成不同的ML框架,如网络监督学习、搜索引擎创建和其他许多用例。它还可以在单节点、多节点和可弹性调整大小的计算机集群上训练和评估模型,因此开发者可以在不浪费资源的情况下扩大其工作规模。

SynapseML的API可用于几种不同的编程语言,其API对各种数据库、文件系统和云数据存储进行抽象,以简化实验,无论数据位于何处。

SynapseML建立在Apache Spark分布式计算框架上,它的.NET绑定是建立在.NET for Apache Spark项目之上的。有关SynapseML .NET API的详细信息,请参阅我们的.NET API文档

开始使用.NET

SynapseML的.NET绑定在一个自定义的NuGet feed中可用。要访问该源,请在终端运行以下dotnet CLI命令,将该源添加为nuget源:

dotnet nuget add source https://mmlspark.blob.core.windows.net/synapsemlnuget/index.json -n SynapseMLFeed

SynapseML的.NET绑定被分割成几个子项目。要安装所有的子项目,请运行以下几行:

dotnet add package SynapseML.Core --version 0.10.0
dotnet add package SynapseML.Cognitive --version 0.10.0
dotnet add package SynapseML.DeepLearning --version 0.10.0
dotnet add package SynapseML.Lightgbm --version 0.10.0
dotnet add package SynapseML.Opencv --version 0.10.0
dotnet add package SynapseML.Vw --version 0.10.0

注意:SynapseML v0.10.0依赖于Microsoft.Spark v2.1.1。 SynapseML v0.10.0的目标是框架netstandard2.1。

之后,你可以通过.NET在Spark上使用SynapseML的API进行分布式机器学习。

在SynapseML中使用LightGBMClassifier的一个.NET例子

注意:按照我们的安装指南来安装先决条件。

为了创建你的第一个SynapseML .NET应用程序,我们将用以下命令创建一个控制台应用程序:

dotnet new console -o SynapseMLApp
cd SynapseMLApp

接下来,我们通过运行以下命令来安装这个演示所需的nuget包。

dotnet add package Microsoft.Spark --version 2.1.1
dotnet add package SynapseML.Lightgbm --version 0.10.0
dotnet add package SynapseML.Core --version 0.10.0

注意:这个例子使用Microsoft.Spark 2.1.1。 请为不同的API添加相应的SynapseML子包。

安装了SynapseML后,我们现在可以构建我们的应用程序。接下来,用下面的代码更新你的控制台应用程序:

using Synapse.ML.Lightgbm;
using Synapse.ML.Featurize;
using Microsoft.Spark.Sql;
using Microsoft.Spark.Sql.Types;

// Create Spark session
SparkSession spark = SparkSession
    .Builder()
    .AppName("LightGBMExample")
    .GetOrCreate();

// Load Data
DataFrame df = spark.Read()
    .Option("inferSchema", true)
    .Parquet("wasbs://publicwasb@mmlspark.blob.core.windows.net/AdultCensusIncome.parquet")
    .Limit(2000);

var featureColumns = new string[] {"age", "workclass", "fnlwgt", "education", "education-num",
    "marital-status", "occupation", "relationship", "race", "sex", "capital-gain",
    "capital-loss", "hours-per-week", "native-country"};

// Transform features
var featurize = new Featurize()
    .SetOutputCol("features")
    .SetInputCols(featureColumns)
    .SetOneHotEncodeCategoricals(true)
    .SetNumFeatures(14);

var featurizedDf = featurize
    .Fit(df)
    .Transform(df)
    .WithColumn("label", Functions.When(Functions.Col("income").Contains("<"), 0.0).Otherwise(1.0));

DataFrame[] dfs = featurizedDf.RandomSplit(new double[] {0.75, 0.25}, 123);
var trainDf = dfs[0];
var testDf = dfs[1];

// Create LightGBMClassifier
var lightGBMClassifier = new LightGBMClassifier()
    .SetFeaturesCol("features")
    .SetRawPredictionCol("rawPrediction")
    .SetObjective("binary")
    .SetNumLeaves(30)
    .SetNumIterations(200)
    .SetLabelCol("label")
    .SetLeafPredictionCol("leafPrediction")
    .SetFeaturesShapCol("featuresShap");

// Fit the model
var lightGBMClassificationModel = lightGBMClassifier.Fit(trainDf);

// Apply transformation and displayresults
lightGBMClassificationModel.Transform(testDf).Show(50);

// Stop Spark session
spark.Stop();

运行dotnet build 来构建项目。然后导航到构建输出目录,并运行以下命令:

spark-submit --class org.apache.spark.deploy.dotnet.DotnetRunner --packages com.microsoft.azure:synapseml_2.12:0.10.0,org.apache.hadoop:hadoop-azure:3.3.1 --master local microsoft-spark-3-2_2.12-2.1.1.jar dotnet SynapseMLApp.dll

注意:这里我们添加了两个包,synapseml_2.12 ,用于SynapseML的scala源代码,hadoop-azure ,用于支持从adls读取文件。

一旦程序终止,你会看到以下预期输出:

+---+---------+------+-------------+-------------+--------------+------------------+---------------+-------------------+-------+------------+------------+--------------+--------------+------+--------------------+-----+--------------------+--------------------+----------+--------------------+--------------------+
|age|workclass|fnlwgt|    education|education-num|marital-status|        occupation|   relationship|               race|    sex|capital-gain|capital-loss|hours-per-week|native-country|income|            features|label|       rawPrediction|         probability|prediction|      leafPrediction|        featuresShap|
+---+---------+------+-------------+-------------+--------------+------------------+---------------+-------------------+-------+------------+------------+--------------+--------------+------+--------------------+-----+--------------------+--------------------+----------+--------------------+--------------------+
| 17|        ?|634226|         10th|            6| Never-married|                 ?|      Own-child|              White| Female|           0|           0|          17.0| United-States| <=50K|(61,[7,9,11,15,20...|  0.0|[9.37122343731523...|[0.99991486808581...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.0560742274706...|
| 17|  Private| 73145|          9th|            5| Never-married|      Craft-repair|      Own-child|              White| Female|           0|           0|          16.0| United-States| <=50K|(61,[7,9,11,15,17...|  0.0|[12.7512760001880...|[0.99999710138899...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.1657810433238...|
| 17|  Private|150106|         10th|            6| Never-married|             Sales|      Own-child|              White| Female|           0|           0|          20.0| United-States| <=50K|(61,[5,9,11,15,17...|  0.0|[12.7676985938038...|[0.99999714860282...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.1276877355292...|
| 17|  Private|151141|         11th|            7| Never-married| Handlers-cleaners|      Own-child|              White|   Male|           0|           0|          15.0| United-States| <=50K|(61,[8,9,11,15,17...|  0.0|[12.1656242513070...|[0.99999479363924...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.1279828578119...|
| 17|  Private|327127|         11th|            7| Never-married|  Transport-moving|      Own-child|              White|   Male|           0|           0|          20.0| United-States| <=50K|(61,[1,9,11,15,17...|  0.0|[12.9962776686392...|[0.99999773124636...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.1164691543415...|
| 18|        ?|171088| Some-college|           10| Never-married|                 ?|      Own-child|              White| Female|           0|           0|          40.0| United-States| <=50K|(61,[7,9,11,15,20...|  0.0|[12.9400428266629...|[0.99999760000817...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.1554829578661...|
| 18|  Private|115839|         12th|            8| Never-married|      Adm-clerical|  Not-in-family|              White| Female|           0|           0|          30.0| United-States| <=50K|(61,[0,9,11,15,17...|  0.0|[11.8393032168619...|[0.99999278472630...|       0.0|[0.0,0.0,0.0,0.0,...|[0.44080835709189...|
| 18|  Private|133055|      HS-grad|            9| Never-married|     Other-service|      Own-child|              White| Female|           0|           0|          30.0| United-States| <=50K|(61,[3,9,11,15,17...|  0.0|[11.5747235180479...|[0.99999059936124...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.1415862541824...|
| 18|  Private|169745|      7th-8th|            4| Never-married|     Other-service|      Own-child|              White| Female|           0|           0|          40.0| United-States| <=50K|(61,[3,9,11,15,17...|  0.0|[11.8316427733613...|[0.99999272924226...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.1527378526573...|
| 18|  Private|177648|      HS-grad|            9| Never-married|             Sales|      Own-child|              White| Female|           0|           0|          25.0| United-States| <=50K|(61,[5,9,11,15,17...|  0.0|[10.0820248199174...|[0.99995817710510...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.1151843103241...|
| 18|  Private|188241|         11th|            7| Never-married|     Other-service|      Own-child|              White|   Male|           0|           0|          16.0| United-States| <=50K|(61,[3,9,11,15,17...|  0.0|[10.4049945509280...|[0.99996972005153...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.1356854966291...|
| 18|  Private|200603|      HS-grad|            9| Never-married|      Adm-clerical| Other-relative|              White| Female|           0|           0|          30.0| United-States| <=50K|(61,[0,9,11,15,17...|  0.0|[12.1354343020828...|[0.99999463406365...|       0.0|[0.0,0.0,0.0,0.0,...|[0.53241098695335...|
| 18|  Private|210026|         10th|            6| Never-married|     Other-service| Other-relative|              White| Female|           0|           0|          40.0| United-States| <=50K|(61,[3,9,11,15,17...|  0.0|[12.3692360082180...|[0.99999575275599...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.1275208795564...|
| 18|  Private|447882| Some-college|           10| Never-married|      Adm-clerical|  Not-in-family|              White| Female|           0|           0|          20.0| United-States| <=50K|(61,[0,9,11,15,17...|  0.0|[10.2514945786032...|[0.99996469655062...|       0.0|[0.0,0.0,0.0,0.0,...|[0.36497782752201...|
| 19|        ?|242001| Some-college|           10| Never-married|                 ?|      Own-child|              White| Female|           0|           0|          40.0| United-States| <=50K|(61,[7,9,11,15,20...|  0.0|[13.9439986622060...|[0.99999912057674...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.1265631737386...|
| 19|  Private| 63814| Some-college|           10| Never-married|      Adm-clerical|  Not-in-family|              White| Female|           0|           0|          18.0| United-States| <=50K|(61,[0,9,11,15,17...|  0.0|[10.2057742895673...|[0.99996304506073...|       0.0|[0.0,0.0,0.0,0.0,...|[0.77645146059597...|
| 19|  Private| 83930|      HS-grad|            9| Never-married|     Other-service|      Own-child|              White| Female|           0|           0|          20.0| United-States| <=50K|(61,[3,9,11,15,17...|  0.0|[10.4771335467356...|[0.99997182742919...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.1625827100973...|
| 19|  Private| 86150|         11th|            7| Never-married|             Sales|      Own-child| Asian-Pac-Islander| Female|           0|           0|          19.0|   Philippines| <=50K|(61,[5,9,14,15,17...|  0.0|[12.0241839747799...|[0.99999400263272...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.1532111483051...|
| 19|  Private|189574|      HS-grad|            9| Never-married|     Other-service|  Not-in-family|              White| Female|           0|           0|          30.0| United-States| <=50K|(61,[3,9,11,15,17...|  0.0|[9.53742673004733...|[0.99992790305091...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.0988907054317...|
| 19|  Private|219742| Some-college|           10| Never-married|     Other-service|      Own-child|              White| Female|           0|           0|          15.0| United-States| <=50K|(61,[3,9,11,15,17...|  0.0|[12.8625329757574...|[0.99999740658642...|       0.0|[0.0,0.0,0.0,0.0,...|[-0.1922327651359...|
+---+---------+------+-------------+-------------+--------------+------------------+---------------+-------------------+-------+------------+------------+--------------+--------------+------+--------------------+-----+--------------------+--------------------+----------+--------------------+--------------------+

就这样,你已经使用SynapseML的.NET绑定训练了一个分布式的LightGBM模型关于更多的使用例子,请看我们的.NET设置指南,其中有一个认知服务的例子。此外,你可以查看我们的.NET API文档,了解机器学习类和功能的完整列表。

自动化Apache Spark的.NET集成

在过去,为Apache Spark模型建立语言绑定是一个手动和劳动密集型的过程。令人惊讶的是,PySpark、SparklyR和Apache Spark的.NET都是手写他们的SparkML APIs。在SynapseML,我们太懒了,懒得做这种腿部工作,而且没有人愿意承担这种维护负担。为了让团队能够坐下来整天喝玛格丽特酒,我们已经创建了一个自动SparkML绑定生成系统。这个系统自动将SparkML和SynapseML的API翻译成Python、R和.NET。

很快,我们希望把这个自动生成系统贡献给.NET for Apache Spark repo,以便在核心库中支持所有剩余的SparkML类。为此,我们重新设计了ML领域使用的基本类,包括ParamsPipelineStageTransformerEstimatorModelEvaluator ,以便更好地与Scala的类层次结构相一致。

我们的代码生成系统也可以在你自己的Scala项目中使用,只要在你的Scala SparkML模型中扩展DotnetWrappable 特质即可。调用继承的方法makeDotnetFile ,可以为你自动生成一个Spark.NET类。我们生成的SparkML类的例子可以在GitHub上找到,在未来的几个月里,请继续关注SynapseML和Spark.NET生态系统之间的更多集成。

总结

今天我们宣布,作为SynapseML分布式ML库的一部分,为C#和F#语言发布了数百个新的分布式机器学习模型和功能。这些公告允许.NET开发人员在享受.NET语言和框架的同时,训练、运行、解释和评估深度学习模型、智能服务、梯度提升树、强化学习系统和许多其他功能。此外,这种整合是完全自动化的,因此SynapseML库的每一次更新都会给.NET生态系统带来更多的模型和功能,而不会花费开发人员数周的时间来实施。我们鼓励.NET社区在他们的下一个应用程序中尝试这些API,并感到有能力与SynapseML团队联系,让我们知道你是如何喜欢它们的!

了解更多