链载Ai

标题: 腾讯AI团队:用Ray分布式计算效率提升800% [打印本页]

作者: 链载Ai    时间: 昨天 12:00
标题: 腾讯AI团队:用Ray分布式计算效率提升800%


ingFang SC";font-variant-ligatures: normal;orphans: 2;widows: 2;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;margin: 24px 8px 0px;line-height: 1.75em;">用Ray分布式计算效率提升800%

机器学习任务跑得慢?数据处理总是卡脖子?一个项目从开发到上线死活提不上速?这些痛点真的让人头大。不过最近翻腾讯AI团队的技术文章,发现他们用Ray分布式框架把计算效率提升了8倍多,这波操作属实有点东西。

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;line-height: 1.75em;">Ray是啥玩意儿

Ray说白了就是一个分布式计算框架,它能把你的计算任务分散到多台机器上并行处理。打个比方,你要洗100件衣服,一个人洗太慢了,现在可以叫10个人一起洗,每人负责10件,速度不就上来了嘛。
importray#初始化Rayray.init()@ray.remotedefheavy_computation(x):returnx*x#并行执行计算futures=[heavy_computation.remote(i)foriinrange(100)]results=ray.get(futures)

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;line-height: 1.75em;">老项目改造有多简单

腾讯团队最牛的是,他们把原来的Python代码改得特别少就实现了分布式。看下面这段代码就明白了:
#原来的代码defprocess_data(data):result=complex_calculation(data)returnresult#改造后的代码@ray.remotedefprocess_data(data):result=complex_calculation(data)returnresult
就加了个@ray.remote装饰器,完事儿~
温馨提示:要是代码里用了全局变量,得把它们都放到函数参数里,不然分布式环境下可能会出问题。

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;line-height: 1.75em;">实际收益有多大

腾讯团队的一个模型训练任务,原来要跑6个小时。用了Ray之后,只要45分钟就搞定了。关键是代码改动超级小,投入产出比相当高啊。
看他们的测试数据:
#处理100万条数据的对比#单机版start_time=time.time()results=[process_data(i)foriinrange(1000000)]print(f"单机耗时:{time.time()-start_time}")#Ray分布式版start_time=time.time()futures=[process_data.remote(i)foriinrange(1000000)]results=ray.get(futures)print(f"分布式耗时:{time.time()-start_time}")

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;line-height: 1.75em;">Ray还能干啥

说实话Ray能玩的花样挺多:
    ingFang SC";font-size: medium;font-variant-ligatures: normal;orphans: 2;widows: 2;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1">
  1. 机器学习训练:多机并行训练模型
  2. 数据预处理:分布式处理海量数据
  3. 参数调优:并行搜索最优超参数
  4. 在线服务:部署模型服务
#并行参数调优示例@ray.remotedeftrain_model(learning_rate):model=MyModel()accuracy=model.train(lr=learning_rate)returnaccuracy#同时测试多个学习率learning_rates=[0.001,0.01,0.1]results=ray.get([train_model.remote(lr)forlrinlearning_rates])

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;line-height: 1.75em;">踩坑指南

啥好事都有坑,Ray也不例外:
    ingFang SC";font-size: medium;font-variant-ligatures: normal;orphans: 2;widows: 2;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;margin-left: 8px;margin-right: 8px;" class="list-paddingleft-1">
  1. 本地变量别乱用,该传参的传参
  2. 大对象传输会变慢,记得压缩或分片
  3. 任务太小反而会更慢,要把任务适当打包
#错误示例global_data=load_large_data()@ray.remotedefbad_function():returnprocess(global_data)#不要这样做!#正确示例@ray.remotedefgood_function(data):returnprocess(data)
温馨提示:分布式环境下的debug比较麻烦,建议先在本地把逻辑调试好再分布式部署。
代码改造其实很简单,但要把活儿干明白还是得多练。腾讯团队这波操作给了个不错的思路,值得学习。有条件的话,项目里可以试试Ray,说不定就能给你的程序加个速。







欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5