使用 Azure Databricks 进行数据科学和机器学习

此体系结构演示如何将 Azure Databricks、Delta Lake 和 MLflow 用于数据科学和机器学习,从而改进操作。 可通过开发、训练和部署机器学习模型来提高整体效率和客户体验。

体系结构

Architecture diagram showing how Azure Databricks works with data storage services to refine and analyze data and make it available for other services.

pic1

该图包含三个灰色矩形:一个标记为“进程”,一个标记为“服务”,一个标记为“存储”。 “进程”和“服务”矩形在图的上部彼此相邻。 服务矩形包含一个带有机器学习和 Azure Kubernetes 服务图标的白框。 另一个白框横跨“进程”和“服务”矩形。 它包含 Azure Databricks 和 MLflow 的图标。 一个箭头从该框指向“服务”矩形中的白色框。 “进程”矩形下方是“存储”矩形。 它包含一个带有 Data Lake Storage、Delta Lake 图标的白色框,以及三个标记为“铜”、“银”和“金”的数据库表。 三条线连接处理和存储矩形,每条线的每一端都有箭头。

该解决方案存储、处理和提供数据:

数据流

存储

Data Lake Storage 以 Delta Lake 格式存储数据。 Delta Lake 构成了数据湖的特选层。 奖牌体系结构将数据组织成三层:

  • “铜”表保存原始数据。
  • “银”表包含经过清理、筛选的数据。
  • “金”表存储可用于分析和报告的聚合数据。

进程

来自各种语言、框架和库的代码准备、优化和清理原始数据 (1)。 编码可能性包括 Python、R、SQL、Spark、Pandas 和 Koalas。

Azure Databricks 运行数据科学工作负载。 该平台还构建和训练机器学习模型 (2)。 Azure Databricks 使用预安装的优化库。 示例包括 scikit-learn、TensorFlow、PyTorch 和 XGBoost。

MLflow 跟踪捕获机器学习试验、模型运行和结果 (3)。 当最佳模型准备好投入生产时,Azure Databricks 会将该模型部署到 MLflow 模型存储库。 此集中式注册表存储有关生产模型的信息。 注册表还使模型可用于其他组件:

Spark 和 Python 管道可以引入模型。 这些管道处理批处理工作负载或流式 ETL 流程。
REST API 为多种目的提供对模型的访问。 例如移动和 Web 应用程序中的测试和交互式评分。

服务

Azure Databricks 可以将模型部署到其他服务,例如机器学习和 AKS (4)。

组件

Azure Databricks 是一个数据分析平台。 其完全托管的 Spark 群集运行数据科学工作负载。 Azure Databricks 还使用预安装的优化库来构建和训练机器学习模型。 MLflow 与 Azure Databricks 的集成提供了一种跟踪试验、将模型存储在存储库中以及使模型可用于其他服务的方法。 Azure Databricks 提供可缩放性:

单节点计算群集处理小型数据集和单模型运行。
对于大型数据集,可以使用多节点计算群集或图形处理单元 (GPU) 群集。 这些群集使用 HorovodRunner 和 Hyperopt 等库和框架进行并行模型运行。
Data Lake Storage 是一种可缩放且安全的数据湖,适用于高性能分析工作负载。 这项服务可管理 PB 量级的信息,同时保持数百千兆的吞吐量。 数据可以具有以下特征:

结构化、半结构化或非结构化。
来自多个异构源,例如日志、文件和媒体。
静态、来自批处理或流式处理。
Delta Lake 是使用开放文件格式的存储层。 此层在 Data Lake Storage 等云存储的顶层运行。 Delta Lake 针对转换和清理批处理和流式处理数据进行了优化。 该平台支持以下特性和功能:

数据版本控制和回滚。
原子性、一致性、隔离性和持久性 (ACID) 事务的可靠性。
数据准备、模型训练和模型服务的一致标准。
按时间顺序查看源数据的一致性快照。 数据科学家可以在快照上训练模型,而不是创建单独的副本。
MLflow 是机器学习生命周期的开源平台。 MLflow 组件可在训练和运行期间监视机器学习模型。 存储的信息包括代码、数据、配置信息和结果。 MLflow 还可存储模型并将其加载到生产环境中。 由于 MLflow 使用开放框架,因此各种服务、应用程序、框架和工具都可以使用这些模型。

机器学习是一个基于云的环境,可帮助你生成、部署和管理预测分析解决方案。 使用这些模型可以预测行为、结果和趋势。

AKS 是高度可用、安全且完全托管的 Kubernetes 服务。 使用 AKS 可以轻松部署和管理容器化应用程序。

方案详细信息

随着组织认识到数据科学和机器学习的力量,你可以提高效率、增强客户体验并预测变化。 要在业务关键型用例中实现这些目标,需要一致且可靠的模式:

跟踪试验。
再现结果。
将机器学习模型部署到生产中。
本文概述了一致且可靠的机器学习框架的解决方案。 Azure Databricks 构成了体系结构的核心。 存储层 Delta Lake 和机器学习平台 MLflow 也发挥着重要作用。 这些组件与 Azure Data Lake Storage、Azure 机器学习和 Azure Kubernetes 服务 (AKS) 等其他服务无缝集成。

这些服务共同为数据科学和机器学习提供了一种解决方案,其中包括:

简单:开放数据湖简化了体系结构。 数据湖包含特选层 Delta Lake。 该层以开源格式提供对数据的访问。

开放:该解决方案支持开源代码、开放标准和开放框架。 此方法可最大程度地减少将来更新的需求。 Azure Databricks 和机器学习本机支持 MLflow 和 Delta Lake。 这些组件共同提供行业领先的机器学习操作 (MLOps),或用于机器学习的 DevOps。 广泛的部署工具与解决方案的标准化模型格式集成。

协作:数据科学和 MLOps 团队使用此解决方案协同工作。 这些团队使用 MLflow 跟踪来记录和查询试验。 团队还将模型部署到中央 MLflow 模型注册表。 然后,数据工程师在数据引入、提取-转换-加载 (ETL) 流程和流式管道中使用已部署的模型。

可能的用例
AGL 为能源预测生成的平台激发了此解决方案。 该平台为数千个并行模型提供快速且经济高效的训练、部署和生命周期管理。

除了能源供应商,该解决方案还可以使具有以下特征的组织受益:

使用数据科学。
生成和训练机器学习模型。
在生产环境中运行机器学习模型。
示例包括以下行业中的组织:

零售和电子商务。
银行和财务行业。
医疗保健与生命科学。
汽车工业和制造业。
后续步骤
AGL Energy 为数千个并行模型构建了一个标准化平台。 该平台为模型提供快速且具有成本效益的培训、部署和生命周期管理。
Open Grid Europe (OGE) 使用人工智能模型来监视天然气管道。 OGE 使用 Azure Databricks 和 MLflow 来开发模型。
Scandinavian Airlines (SAS) 在协作研究阶段使用 Azure Databricks。 该航空公司还使用机器学习来开发预测模型。 通过识别公司数据中的模式,这些模型可以改善日常运营。

《好好说话2》节选

第一十二章 第一节 避开冲突危险区

  • 顾虑之所以是顾虑,正是因为对方不太方便讲得太明白,只能让你自己去领悟。所以,当你第一反应觉得对方有意冷淡,甚至是有意刁难的时候,先别急着发火。想一想,有没有可能是对方心里存在你没有意识到的顾虑?帮对方打消这个顾虑,你们才能进行融洽的交流。

第一十四章 第三节 道歉的方式比道歉更重要

  • 这样的表达,把说谎归咎于“自私”,比起你直接说“是因为你太强势”,或者“是因为我太胆小”要好得多。

第一十六章 第一节 破除困境的观念升级包

  • 思维会被说话的方式影响。当你用“无我”的方式叙事时,你和听众的想法和注意力全都在对象身上,而没有你自己。因此,你的表述是表面和片面的,而且你的听众也只能跟你聊这个对象,话题受到了很大限制。可是,一旦你开始在讲话里代入“有我”的视角,你的叙事就会立体起来,你和听众能聊的东西也会更丰富。

第一十七章 第二节 1秒抓住别人的注意力

  • 使用“基础模型”时,要特别注意,在别人理解了你想传达的大致观念之后,接下来就要强调细节上的区别。这样做,一来是突出你的新意,不跟原型混淆;二来也可以让对方的理解更为精准,避免先入为主的误解。比如,《异型》固然可以说是太空版的《大白鲨》,但是在跟美术设计谈怪物的造型时,一定要强调这毕竟是“太空版”,脑洞得开得更大才行。
  • 总之,当你需要让别人认真思考,给你有建设性的意见的时候,可以给他设定一个身份。有了角色感,对方才知道该从哪个角度去看问题,知道应该关注什么、给出什么方向上的建议。

第一十八章 第三节 高效讨论决定沟通结果

  • 更好的接话方法:“你这个想法很有意思……我试着补充一个角度……”
  • 想要满足客户,
    就不能被对方“想象中的需求”误导,
    而必须找到他的“真实需求”。
    〇•可能遇到的问题
  • 常见的说法:“老板,我觉得您的计划需要的资金太多,而且也没事先做过调研,还要分析一下投入资金后,可以打败什么竞品。所以我觉得,这项计划不是很靠谱。”

第二十章 第一节 提要求不等于忍受尴尬

  • 比如,催人还钱时可以这样问:“如果我要麻烦你把上次借走的一千块钱还给我,会不会让你很介意啊?”这时候,该不好意思的是对方而不是你。如果对方表示介意,你也可以把他的话接过来说:“我就是怕你会尴尬,所以之前才一直都不好意思跟你提,但我想,一直不讲也不是个办法吧!”
  • 在亲密关系里,重点从来都不是“提要求”,而是“给甜头”。因为无论如何,对方是希望你开心的。所以你只要表达自己在什么情况下,会因为什么而开心,就能引导对方的行为朝你希望的方向走,不用傻傻等待,不用忍气吞声。“这样做会让我开心”这个逻辑,能让你得到自己想要的东西,也让对方感到快乐和满足。
  • 情绪来表达感谢,往往比语言更打动人。善于道谢的人,会让别人感到明明是在给你买东西,却比给自己买东西还开心。

第二十一章 第二节 眼里有别人才能有自己

  • 没有人天生喜欢屈从别人。投诉不是要逼人屈服,而只是想请人遵守规定。所以我们没必要和服务人员对立,也不需要盛气凌人压倒对方。不管你事先知不知道他们的规定,都要先问一遍,让他亲口说出来,因为这会强化对方遵守这些规定的意愿。

第二十四章 第一节 “会聊天”不靠信息,靠情绪

  • 更何况,人很有意思,你越是逼问,他就越不愿意说;相反,你表现得若无其事,对方反而会更愿意主动分享。换句话说,如果你故意表现得“我不是很好奇,你不一定要回答”,反而会增加对方主动分享的概率。
    就算最终对方不愿意分享他的情况,你光是表示“我不会逼问你……但如果你想聊,我也很愿意听”,就已经传达出你的关心和体贴了。就算不依靠聊八卦或自我揭露来促进彼此的关系,只要给对方留下好印象,其实就是一种慢慢拉近距离的方法。
  • 从最低层到最高层依次是“家庭”“学校”“饮食”“工作”和“艺术”(泛指音乐、影视、书籍、绘画等各类作品)。

第二十五章 第二节 安抚对方内心的小孩

  • 父母在进行亲子沟通时就必须意识到,孩子感到委屈的时候,要在第一时间成为他的“安全角”。
  • 而要通过“增强自信”来建立安全感,具体的方法有三个:(1)吐槽吃醋对象;(2)反过来吃对方的醋;(3)把吃醋变成秀恩爱。
  • 所以,鼓励一个人,既不能完全顺着他,也不能过度激烈,而是应该去唤醒他的另一种角色意识,然后再对他进行疏导。这在心理学上叫作“意识唤醒”。

第二十六章 第三节 亲密互动的特殊规则

  • 因为别人如果只看到优点,就会觉得:“这个人固然好,但跟我总像是隔着一层,感觉不够亲密。”
  • 不用害怕失去形象,事实上这些糗事才能真的拉近彼此的距离。在这方面,心理学家威尔斯(Thomas Ashby Wills)有一个暗黑的发现:很多人其实是通过“向下比较”,来提升自己的幸福感的。面对比自己优秀的人,很容易产生嫉妒跟压力。但是发现别人不如自己,就会更容易产生亲近感和同情心。换句话说,你的缺点跟失败,反而是最适合增加亲密度的话题。
  • 这个故事听起来像是一个笑话,但很多情况下,人的心理真的就是这样:当一件事从“我想要这么做”变成“我被迫要这样做”的时候,人就会失去内在的驱动力。如果这件事回报太少,甚至是费力不讨好,人就会渐渐产生排斥的情绪,最后不愿意再继续

第二十七章 Chapter 06 理解用情商表达自己

  • 总体原则是“理解他人”和“理解自己”。因为理解他人,所以不会固执于自我视角,有足够的思想弹性,既能够充分理性地跟人沟通,也能够照顾到别人的情绪。因为理解自己,所以能够平等待人,在跟人交流的时候懂分寸知进退,既不会咄咄逼人,也不会失去自己的立场。

第二十八章 第一节 思想弹性,决定沟通的可能

  • 正因为如此,生活中有很多沟通都是表面的,并没有真的有效交流。有时候,你看到一个人在跟别人叽叽呱呱、你来我往地聊天,但事实上,他从头到尾可能就只是在跟他心中所预设的、所假想的那个对象在说话。可是你要知道,如果你只听到自己想听的,那你就根本没在听。
  • “因为我不同意,所以我何必懂”,这是拒绝沟通;“即便我不同意,但是我能懂”,这才是好的沟通者。能分清楚“我理解”跟“我同意”的人,都是弹性非常大、能好好说话的人。这样做,既不用跟对方争吵,也能让你的反对听起来更加合情合理。

第二十九章 第二节 权利对等,才能享受亲密关系

  • 改变,一定要从自己出发,不要妄想改变别人。自我坚定,才能活出自己想要的样子。我们无法改变父母对我们的态度,可是,我们可以改变我们对父母的态度。你会发现,一旦你对父母的态度改变了,其实他们就伤害不到你了。总有一天,你的父母会从你的态度里理解到:“噢!我的孩子已经长大了!”

用Git和Gitlab进行协作

在Gitlab上的远程仓库为每个用户创建分支, 例如dev-xxx
本地clone项目以后用fetch命令将远程分支拉到本地

1
git fetch origin dev-xxx:dev-xxx

在本地切换分支

1
git checkout dev-xxx

然后进行开发并提交修改
开发完成后提交到远程dev-xxx分支

1
git push -u origin dev-xxx

之后可以在网页端提交merge request

注意: 为了确保本地dev-xxx分支和远程仓库master分支一致, 请在每次开发前先更新本地仓库(dev-xxx分支)

1
2
3
git checkout dev-xxx
git fetch --all
git reset --hard origin/dev-xxx

Gitlab服务器的备份和迁移

之前在一台Ubuntu的服务器上搭建了一个Gitlab服务器,最近这台服务器即将被回收,所以需要将原来的Gitlab迁移到新的服务器上,由于我是用Omnibus安装的,备份和还原的步骤相对来说比较简单,但也有不少需要注意的点。

首先说一下环境和版本

  • 系统:Ubuntu 16.04
  • Gitlab版本:gitlab-ee_10.7.0-ee.0_amd64
  • 安装方法:Omnibus

大致流程如下

  1. 在原服务器执行备份
  2. 在新服务器安装相同版本的Gitlab
  3. 将原服务器的备份传输到新服务器
  4. 执行还原命令
  5. Done

在原服务器进行备份相当简单,只需要执行以下命令
gitlab-rake gitlab:backup:create
默认的备份位置是/var/opt/gitlab/backups,由于原服务器这个分区的空间已经不足了,所以在备份的时候出现报错,这里顺便提一下,第一次报错以后我把backups文件夹删除又创建了,再执行备份命令的时候提示权限不够,执行以下命令可以解决

1
2
chown git /var/opt/gitlab/backups
chmod 700 /var/opt/gitlab/backups

磁盘空间不足的问题可以通过修改备份的保存位置解决
打开/etc/gitlab/gitlab.rb文件,找到这一行
default['gitlab']['gitlab-rails']['backup_path'] = "/var/opt/gitlab/backups"
修改后面的路径以后reconfigure一下再备份即可

在新服务器上安装完gitlab以后,执行以下命令进行还原

1
2
3
4
sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq
sudo gitlab-rake gitlab:backup:restore BACKUP='your_backup_file'
sudo gitlab-ctl restart

如果要备份和还原配置文件的话只需要将/etc/gitlab文件夹打包传输到新服务器,解压放到新服务器相同的目录下。可以将新gitlab产生的配置文件夹备份一下以备不时之需。

elasticsearch--从安装到使用

最近在做一个实体链接的项目,主要是先用命名实体识别的模型去识别文本中的特定实体,然后再将识别出来的实体链接到知识图谱中对应的节点。之所以要这么做是因为往往识别出来的实体名字并不和图谱中的节点完全对应。关于实体链接的具体细节在这里不多赘述,因为不是本文的重点,大致就是对每个识别出的实体从图谱中选出一些候选节点,计算相似度然后选最相似的。

这里主要说一下挑选候选节点这一步,之所以要用到elasticsearch,是因为我们的图谱目前还不支持模糊搜索,而es的match提供了很好的模糊搜索功能,并且还能给每个结果打分。

我的系统是macOS 10.13.5,安装的es版本是5.6.4。在macOS上有两种主流的安装方法,一种是从官网直接下载压缩包,另一种是用homebrew安装,本文使用的是前一种方法。
首先去官网下载对应版本,下载解压缩完以后我把放在用户根目录下,所以路径是~/elasticsearch-5.6.4/,这时候其实已经可以运行了,执行elasticsearch-5.6.4/bin/elasticsearch就可以启动es。但是有一个问题,es默认的analyzer对中文的分词不是很友好,往往会在搜索的时候把中文分成一个个字,这显然不是我们想要的,好在有ik插件,解决了这个问题。安装ik插件也有两种方法,一种是手动从官网下载安装包放到指定文件夹,另一种可以用elasticsearch-plugin命令来安装(需要安装5.5.1版本以上的es)
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.4/elasticsearch-analysis-ik-5.6.4.zip
因为我安装的es高于5.5.1,所以我采用了这种方法,很方便。具体可以参考官方repo

接下来就是es的使用了,首先了解一下es中的索引,它是ES中的一个存储类型,与数据库类似,内部包含类型字段,类型中包含各种文档。如果和关系型数据库进行类比的话,索引就是数据库,类型就是数据库中的表,文档就是每张表中的每一行记录。
下面介绍一些常用的操作

  • 查看所有索引
    curl 'localhost:9200/_cat/indices?v'

  • 创建一个名为country的索引
    curl -XPUT 'localhost:9200/country?pretty'

  • 在country中设置一个名为city的类型,并写入一条数据

    1
    2
    3
    4
    curl -XPUT 'localhost:9200/country/city/1?pretty' -d '
    {
    "name": "London"
    }'
  • 查询

    1
    2
    3
    4
    5
    6
    7
    8
    curl -XGET 'localhost:9200/country/city/1?pretty'
    {
    "_index" : "country",
    "_type" : "city",
    "_id" : "1",
    "_version" : 1,
    "found" : true, "_source" : { "name": "London" }
    }
  • 删除索引
    curl -XDELETE 'localhost:9200/customer?pretty'

另外如果需要在python中使用es,可以参考以下文章

近阶段的总结和反思

创建这个博客也一年多了,其实很长一段时间里并没有很用心地去经营和维护它,从博文的更新数量就可以看出来…我也看了不少人的博客,发现一个现象,很多人在像csdn、博客园之类的网站开的博客能持续地更新下去,而自己用wordpress或者hexo搭建的博客往往只用了一段时间,发表了寥寥几篇博文就遗弃了。我觉得大概是因为只是想体验一下搭建博客这个过程吧,而我呢,一直想写些什么,不论是技术总结,亦或是生活点滴,却总因为这样那样的原因被搁置,惭愧。

转眼已经参加工作五个多月了,好像也渐渐适应了工作的节奏,其实对我来说和大学时代没有太大的区别,要说有的话可能就是少了一些自由度,多了一些压力。学生时代也是有压力的,只不过压力大多来自自己,期望作业、项目做的尽可能完美,期望考试分数尽可能的高。而在工作中,压力来源多了上级和项目。经常会看到一些观点,认为说为老板打工只需要把老板交代的工作做完便罢,但我不以为然,工作是一个付出和回报的过程,这里的回报并不局限于金钱,也包括自身知识、技术、为人处世等等方面的积累,我认为这些方面也很重要。

这段时间以来,每天其实都过的挺充实的,白天在公司上班,晚上回来以后一般会继续工作或者学习一会儿(要看的东西真不少呢),然后玩会儿游戏放松一下。但是总觉得缺了些什么,好像自己一直处于一种被动的状态,例如说今天项目需要我去做一个前端的界面,但是这并不是我的专长,于是我从研究算法跑去研究了一段时间的前端,好不容易捣鼓出一个像样的东西了,自己也挺有成就感的,顺便新点了一个技能树,也许可以成为一个全栈工程师呢:)但是呢,哪有人可以样样都精通呢,术业有专攻,如果把过多的时间放在的别的方向,对自己本来的发展方向并不一定有利。所以我觉得制定一个目标和切实可行的计划是有必要的,在确保在朝着目标前进的同时,如果有闲暇时间,去学习一些别的知识是好的。基于此,我想在这里谈谈我的计划。我目前的方向是自然语言处理,因此便以此为重心。

  • 夯实算法基础
  • 跟进前沿技术,尤其是目前在做的项目相关的,包括NER、关系抽取、知识图谱等。看论文采取遍地撒网、重点捕捞的策略
  • 增加代码积累,在公司项目之外争取可以参与或自己开展一些小项目

暂时想到以上三点,后续可能再添加,不过我觉得如果能做到我自己就满意啦:)

在服务器上部署vue项目

之前用vue-cli搭建了一个ICD编码和电子病历信息抽取的前端小工具,这里讲一下如何部署在服务器上

Read more

用flask、gunicorn和nginx在centos上部署API

最近需要把ICD编码和命名实体识别的API部署在公司外网gpu服务器上,服务器是centos系统的,网上的教程大多数都是基于ubuntu的,于是自己研究了一下,简单说一下步骤吧。

Read more