Karrot(韩国Danggeun Market的全球服务)是一个本地社区服务运用程序,基于二手市场连接邻居。Danggeun Market于2015年推出,在韩国有超越2300万人在当地社区运用Danggeun Market。现在,卡洛特在英国、美国、加拿大和日本四个国家的440个当地社区运营。在咱们的服务中,翻滚阅览饲料以寻觅廉价和有用的物品已成为用户的日常乐趣。为了获得更好的用户体会,咱们一向在运用几种机器学习模型,如引荐模型。
咱们也在努力研究怎么有效和高效地运用ML模型。特别是,咱们正在投入许多精力树立机器学习管道,用于定时布置、快速试验和持续改进模型。
对于ML管道,咱们一向在运用TFX(TensorFlow Extended)进行出产。因而,在这篇文章中,咱们将扼要介绍咱们为什么运用TFX,以及咱们怎么利用TFX来进步出产力。
Karrot中的机器学习
在Karrot内部有许多ML项目。ML模型在服务内部运转。例如,咱们运用自动化模型来检测欺诈行为,还有引荐模型来改善咱们运用程序上的用户体会。假如你对这些模型的详细描述感兴趣,请参阅咱们的团队博客,这些博客是用韩语写的。
因为咱们一向在运用Kubeflow来处理咱们的ML模型,咱们能够定时地练习、试验和布置模型,但仍然有一些痛点。随着咱们去年开始将TFX与Kubeflow一起运用,TFX进一步推动了这条线路,让团队轻松运用咱们的出产管道。
TFX怎么帮助咱们进行出产型ML
TFX经过敞开和可扩展的设计帮助咱们轻松构建和布置出产型ML管道。 |
TFX在2019年彻底开源,是一个用于出产ML管道的端到端渠道。它支撑在组件单元中编写ML作业流,然后能够在多种环境中运转 -Apache Beam、Dataflow、Kubeflow和Airflow。它还为数据吸取/转化、练习和布置提供了精心编写的规范组件。
规范组件
TFX提供了几个规范组件。假如你正在寻觅数据吸取的组件,有基于本地CSV文件的CsvExampleGen、PrestoExampleGen和BigQueryExampleGen,它们能够直接从Presto、BigQuery和许多其他来历吸取数据,并进行一些定制。因而,你能够轻松地处理来自多个来历的数据,只需将预建组件连接到你的TFX管道。
它还能够顺畅地处理大规模的数据处理。因为履行特征工程的Transform组件是在Apache Beam上完结的,你能够在GCPDataflow或其他计算集群上以分布式办法履行它。
当然,还有许多其他方便的组件存在,并不断被增加。
组件的可重用性
为了使TFX习惯咱们的产品,需求定制组件。TFX有一个结构良好的组件设计,使咱们能够自然地创立自界说组件,并轻松地将它们连接到现有的TFX管道。一个简略的Python函数或容器能够转化为TFX组件,或者你能够用与规范组件彻底相同的办法编写整个组件。更多细节,请检查自界说组件攻略。
为了经过提供这些优势来进步咱们的出产力,咱们在咱们的ML管道平共享有类似运用情况的自界说组件,作为Karrot Market的内部库。
支撑各种运转程序
TFX与各种环境兼容。它能够在你的笔记本电脑上本地运转,也能够在DataFlow上运转,GCP的批量数据处理服务与Apache Beam兼容。你能够经过在Jupyter笔记本中手动运转每个组件来完结输出的可视化。TFX还支撑KubeFlow和Vertex AI,它们最近也发布了新的功用。因而,流水线代码只需写一次,然后几乎能够在任何地方运转。咱们能够简略地一次性创立开发、试验和布置环境。出于这个原因,经过运用TFX的服务,咱们将模型布置到出产中的担负大大减轻。
技术经验
随着咱们用TFX树立起咱们的ML管道,代码质量和咱们在模型开发方面的经验都有所进步。
然而,也有一些困难。咱们的团队中没有一致的项目结构或最佳实践。也许这是因为TFX自身比较新,咱们在榜首版之前就现已在运用它了。了解代码和开始贡献变得更加困难。随着管道越来越大,越来越复杂,越来越难了解自界说组件的意义、相应的装备值和依靠性。此外,向团队介绍一些最新的功用也很困难。
改善开发经验
咱们决议为TFX管道创立并运用一个模板,以便更简略了解对方的代码,以相同的形式完结管道,并彼此共享专业知识。咱们兼并了Karrot中常常运用的组件,并把它们放在一个共享库中,这样就能够十分迅速地开发ML管道。
估计该模板将加快新项目的开发。此外,如上所述,咱们希望每个项目都有一个类似的结构,使之更简略了解彼此的项目。
到现在为止,咱们现已简略地介绍了模板项目。下面是咱们为了在这个项目中更好地运用TFX的一些考虑。
装备榜首
咱们优先考虑咱们的装备榜首。经过阅览管道的装备,应该足以了解管道怎么作业。假如咱们能够十分简略地了解详细的设置,咱们就能够设置各种试验,并进行AB测验。
example_gen_config.proto
写在协议缓冲区(Protobuf)中,表示装备的标准。 ,保存数值, ,树立管道。config.pbtxt
pipeline.py
// config.pbtxt
example_gen_config {
big_query_example_gen_config {
query: "# query for example gen"
}
...
}
...
// example_gen_config.proto
message ExampleGenConfig {
oneof config {
BigQueryExampleGenConfig big_query_example_gen_config = 1;
CsvExampleGenConfig csv_example_gen_config = 2;
}
...
}
// When BigQueryExampleGen is used
message BigQueryExampleGenConfig {
optional string query = 1;
}
// When CsvExampleGenConfig is used
message CsvExampleGenConfig {
optional string input_base = 1;
}
# pipeline.py
def create_pipeline(config):
...
example_gen = _create_example_gen(config.example_gen_config)
...
def _create_example_gen(config: example_gen_config_pb2.ExampleGenConfig):
...
if config.HasField("big_query_example_gen_config"):
...
return ...
if config.HasField("csv_example_gen_config"):
...
return ...
raise ...
ExampleGen的一切装备都是由单一的ExampleGenConfig
消息决议的。同样地,一切的管道组件只依靠于它们的装备,并由它们创立。这样一来,你只需看一下装备文件就能了解管道的结构。还有一个目的是,经过分离界说每个组件的部分,使定制和代码了解更简略。
例如,让咱们假定以下情况。为了今后测验数据转化,转化组件需求支撑各种数据处理办法。你可能想在Transform组件中增加一个数据扩增处理。那么应该经过增加一个与数据扩增功用相关的装备来完结。同样地,你能够扩展预界说的Protobuf规范,以方便地支撑多种处理办法,并使其简略看到要运用的处理办法。
用Protobuf办理装备文件
关于上面的示例代码,有些人可能会问为什么要用Protobuf作为装备东西。这有几个原因,咱们将与YAML比较优势,YAML是装备的常见做法之一。
首先,Protobuf有一个强健的接口,而且类型检查等验证作业也很方便。因为Protobuf事前界说了对象结构,所以不需求检查是否有任何字段被界说。此外,在一个正在开发的项目中,支撑前向/后向兼容是十分有用的。
别的,你能够很简略地检查管道结构。YAML 具有分层结构,但在机器学习生态体系中常常运用的 hydra 的情况下,阶段(如出产、开发、阿尔法)设置被分为几个文件,所以咱们以为 Protobuf 具有更好的稳定性和可见性。
假如你运用Protobuf作为你的项目设置东西,许多在TFX中界说的Protobuf界说能够被重复运用。
运用Bazel的TensorFlow生态体系
Bazel是一个独立于语言的构建体系,易于扩展并支撑各种语言和东西。从简略的项目到运用多种语言和东西的大型项目,它能够在大多数情况下快速而简练地运用。欲了解更多信息,请参阅Bazel文档页面上的Bazel Vision。
在Python项目中运用Bazel是一个不常见的设置,但咱们运用Bazel作为TFX模板项目的项目构建体系。简略介绍一下原因如下。
首先,它与Protobuf配合得十分好。因为Bazel是一个独立于语言的构建体系,你能够轻松地将你的Protobuf构建工件作为依靠项与其他构建绑定,而不用忧虑。此外,Protocol Buffer资源库自身也运用Bazel,所以很简略将其集成到基于Bazel的项目中。
第二个原因是TensorFlow生态体系的特殊环境。TensorFlow生态体系中的许多项目都运用Bazel,而TFX也运用Bazel,所以你能够很简略地运用Bazel与其他项目(TensorFlow、TFX)链接构建。
内部自界说TFX模块
如前所述,咱们一向在为跨多个项目常常运用的自界说TFX模块(特别是自界说组件)树立一个内部库。卡洛特的任何人都能够增加他们的组件并与团队共享。
例如,咱们正在运用ArgoCD来办理Kubernetes集群中的运用程序(如TF Serving),因而,假如有人开发了一个用于与ArgoCD布置的组件,咱们能够很简略地经过内部库共享它。这个库现在包含了几个自界说模块,供咱们的团队进步作业效率。
咱们之所以能以内部共享库的形式共享咱们的定制功用,可能要归功于TFX的模块化结构。经过这一点,咱们能够轻松进步团队的全体出产力。咱们能够重复运用从几个项目中开发的大部分组件,并十分简略地开发新项目。
总结
TFX为开发出产型ML管线提供了许多很棒的功用。咱们在Kubeflow上运用TFX进行ML管道的开发、试验,并以更好的办法进行布置,它给咱们带来了许多优点。所以咱们决议在这篇博文中介绍咱们是怎么运用TFX的。