去哪儿酒店算法服务,去哪儿网官方网站

去哪儿 6
去哪儿酒店算法服务 张中原 请在此插入照片(直接覆盖在中间区域) 讲师介绍 张中原 •2008哈工大•2011去哪儿网•从事交易系统、酒店数据、 公司基础平台组件、存储与监控等工作•关注工程师效率和质量、系统实际效益 目录 CONTENTS 1算法平台简介2模型运算3特征处理4代理与服务5性能调试等 算法平台简介 —先解决部署的问题 算法平台规划 算法部署 模型上线、迭代 数据集合 用户、酒店等 训练平台 算法快速评测 •9个应用•530个模型共30564个•120G特征数据•QPS20+由业务系统决定•P9810msMEAN5ms•支持任意类型运算封装,不仅是模型•算法一次发布随时变更,对业务零影响•特征转换可随时调整,在线离线逻辑统
平台现状 数据组数据收集 算法组 训练模型 模型文件 特征集 算法部署 业务组 •没有标准规范,管理乱,效率低•训练预测时特征转换独立,重复开发或逻辑不一致•模型之间共同功能复用率低•算法变更影响大,不兼容•跟踪调试复杂 部署的问题 HDFS 模型训练 算法服务RPCService 模型库 加载模型 特征集 加载特征 算法平台 apiagent •托管维护模型文件和特征集•自动加载模型与特征数据•提供统一调用接口•使模型预测无缝接入应用•算法随时更新迭代对业务系统完全透明 算法部署 算法定义 •算法版本迭代•城市粒度控制•适应不同模型类别•特征转换逻辑•分类与回归 算法定义 算法描述 interfaceAlgorithm{StringgetApp()StringgetVersion()<
P,F>FeatureResolver<
P,F>getFeatureResolver()<
F,R>Evaluator<
F,R>getEvaluator()ListenableFuture>eval(Requestrequest)throwsAlgorithmException }interfaceAlgorithmFactory{ AlgorithmgetOrCreate(app,version,filter)} //回归interfaceResultValue{ RgetValue()MapgetContext()} //调试用 算法描述 //分类interfaceHashProbabilityextendsResultValue{ SetgetCategoryValues()DoublegetProbability(Stringkey)} 算法描述 ListenableFuture>eval(Requestrequest){checkUpdate()//触发模型文件异步更新检查 returnexecutor.submit(Callable)()->{RequestContextctx=RequestContext.create(request)try{returnevaluator.eval(resolver.resolve(request.example)).setContxt(ctx.getValue())}finally{RequestContext.remove()} }} 模型运算 模型类别PMMLVopalWabbitDataProc自定义模型 优点标准、平台无关、功能全、用户多快、模型小未知强大、灵活 模型对比 缺点略慢C++旧系统兼容额外开发 interfaceEvaluator<
F,R>{ResultValueeval(Fresolved) } Evaluator定义 EvaluatorFactory{ Evalutorcreate(config,filter,model){ Evaluatorinstance=...//config.type //KVStoreSupport -需要访问特征数据 //AlgorithmFactoryAware-需要子模型支持 //... } } VowpalWabbit例 classVWEvaluatorimplementsEvaluator{ finalVWModelmodel;//自实现Java版 ResultValueeval(FeatureVectorvector){ RequestContextctx=RequestContext.get(); ctx.set("trace1","xxxx")//request.debug=true时有效 ctx.getRequest() //原始Request returnnewSimpleResultValue(model.predict(vector))} PMML例 classPMMLEvaluatorimplementsEvaluator{ finalPMMLmodel;//JPMML HashProbabilityeval(Mapmap){ModelEvaluatore=newMiningModelEvaluator(pmml);…returnnewProbabilityDistribution(result,probabilities) }} 复合模型例 classXXXEvaluatorimplementsEvaluator<
F,R>{finalPMMLpmml;finalVWModelvw; ResultValueeval(Ffeature){//ResultValuevalue=pmml.eval(feature)//附加逻辑//vw.eval(value)//… }} 特征处理 特征转换场景 转换场景 技术选型 问题 模型训练 Python,shell,hive等 不易管理沟通不畅导致应用时逻辑不一致 模型应用Java 每个模型都要开发与训练逻辑相同时无法重用更新调整慢影响大 •特征转换与模型绑定,便于管理•统一转换逻辑,使训练预测保持一致•在线离线统一转换配置•可随时调整生效,降低影响•方便跟踪调试 特征转换 特征转换 特征转换描述 价区格间房型预日订期 设备 支付 类型 类型 Aerosolve FetureVector{map>map>list>map> stringFeaturesfloatFeaturesdenseFeaturesrawFeatures interfaceTransform{voiddoTransform(FeatureVectorfeatureVector) } 各种场景使用时,统一转化为FeatureVector•FeatureVectorParser支持Map,List(hive用)等•FeatureVectorWriter支持None,Map等 Aerosolve Map MapParser FeatureVector Transform MapWriter Map Evaluatorastable ResultValue defcategory_temperature(value):ifnotvalue:return'未知'ifvalue<10:return'冷'ifvalue<30:return'良'else:return'热' Aerosolve privateStringcategory(Doublevalue){if(value==null)return"未知";if(value<10):return"冷";if(value<30):return"良";elsereturn"热"; } Aerosolve category_temperature{ transform:category keys:[temperature] output:all outputKey:$key #支持$key,$value,$category,自定义 outputValue:$category#同上,可根据需要扩展 categories:{ '' :未知 '<10':冷 '<30':良 '>=30':热 } } 转换器 defaultcategorycrossstoreencodelogtrace?
作用 设置缺省值分类转换,数值归一等向量交叉运算访问特征集进行数值展开模型运算前置编码转换输出转换中间状态反馈用户到模型 自定义转换器 FeatureResolver classTransformFeatureResolver<
P,F>{Transformtransform=TransformFactory.createTransform(config.transform) publicFresolve(Pparam){FeatureVectorvector=parser.parse(Pparam)transform.doTransform(vector)returnwriter.write(vector) }} HIVE调用 addjarhdfs://.../udfs/algorithm-hive-1.1.0-jar-with-dependencies.jar;CREATETEMPORARYFUNCTIONtransform_func AS.qunar.hotel.algorithm.store.udf.FeatureTransformToStringUDF'; INSERToverwritetabledm_user_features_v2partition(dt='$DATE') selectuid,transform_func( 'remote:///vw_detail_price #开发测试时可用file:///,hdfs:/// ?
transformer=transformer_user &writer=writer_user &parser=parser_user',*,dt) from
tmp_user_portrait_v2 wheredt='$DATE'anduidisnotnullandtrim(uid)<>''; 代理与服务 方式 优点 代理性可能独略立好部署 系统边界清晰服务变应更用扩接展入灵便活捷 跟踪监控统
缺点消耗业务系统资源监控联调复杂变更影响大 RPC消耗 代理 •节省内存•提升性能 算法缓存 abstractAlgorithmCacheimplementsAlgorithmFactory{LoadingCacheconfigCacheLoadingCachealgorithmCacheLoaindgCachefallbackAlgorithmCache abstractAlgorithmcreateAlgorithm(app,version,filter)} AlgorithmBuilderextendsAlgorithmCache{ AlgorithmcreateAlgorithm(app,version,filter){ Configconfig... //cachedremoteconfig FeatureResolverresolver...//config.transform Algorithmalgorithm... //config,resolver,executor CachedRemoteFilemodel...//app,version,filter model.addListener(cached=>{//autoupdate algorithm.setEvaluator( createEvaluator(config.type,cached.file)) } if(!
lazyInit) //lazyinit model.update() algorithm.model=model 代理 代理 AlgorithmBuilderbuilder=AlgorithmBuilder.create().setServer(..)//configserver.setStore(..)//kvstore(redis).setLazyInit(..).setExecutor(..) Algorithmalgorithm=builder.getOrCreate(app,version,filter) interfaceAlgorithmService{ResultValueeval(Requestrequest); } 算法服务 //同步AlgorithmServicesevice=..ResultValueresult=service.eval(request) //异步AlgorithmServiceAsync=..ListenableFuture>future=service.evalAsync(request) 性能与调试 •异步并发(guava)•基础数据类型(koloboke,trove4j)•VowpalWabbit模型<0.2ms•复合模型<30ms•IO占90%以上•RequestContext上下文 性能与调试 性能与调试 Request(app,version,filter,featureVersion,debug,context,Texample ) //用于ab测试,默认用version//DebugContext开关//请求附加参数,如id//可自定义,通常为Map,List 监控效果 监控效果 系统展示 在线测试 转换配置

标签: #去哪儿 #去哪儿 #什么时候 #华为 #怎么查看微信是什么时候注册的 #什么时候 #什么时候开始 #什么时候