本系列是作者用 python 学习 Ray 框架的笔记。 Ray 是 UC berkley 提出的分布式机器学习。sklearn 是运行在单机上的机器学习,虽然支持多线程,但分布式并不支持。如果读者不熟悉Ray,本篇文章不适合新手上路,可以学习文章后尾的两篇文献。刚上手学习Ray,自然要想着怎样加埋点,怎样写日志。
写埋点,既可以用print命令,也可以用loggin模块。一般而言,对于ray都工作,但当线程中断,睡眠后,再唤醒,print和logging就不工作。这个问题得到了解决。 可以看文末的解决代码。 目前的ray版本是1.2.
先看原码,
import ray
import time
ray.init();
@ray.remote
def f():
a = 3;
print("before print",flush=True);
time.sleep(1);
print("after print",flush=True);
time.sleep(2);
print("end",flush=True);
return 1;
for _ in range(3):
f.remote()
运行源码,结果只有如下所示:
2021-03-12 16:00:58,577 INFO services.py:1092 -- View the Ray dashboard at http://127.0.0.1:8265
(pid=49020) before print
(pid=49021) before print
(pid=49022) before print
第二个print,第三个print都没有显示出打印结果,该问题被ray的forum提及,但目前(2021年3月12日)还没有跟进解决方案,只是大家尽量避开。该问题已经在2021年4月25日得到解决。 作者也在StackOverflow上回复了相同问题。
Ray 的入门学习材料:
- [学习Ray 之前必读,quick tutorial on ray]
- [A Gentle Introduction to Ray]
后续
1. 该问题,已经被具体,代码需要符合ray的运行机制。工作的代码如下:
import ray
import time
ray.init();
@ray.remote
def f():
a = 3;
print("before print",flush=True);
time.sleep(1);
print("after print",flush=True);
time.sleep(2);
print("end",flush=True);
return 1;
f_handles =[f.remote() for _ in range(3)]
ray.get(f_handles)
编辑历史:
1. 本博客在2021年4月25日被更新,编辑。该问题已经被解决,解决原因是一般python运行语法不符合ray运行机制。