DGL distgraph store OP
DGL distgraph store OP
- DistGraph Server and Client
- Server(含对比)
- RPC OP
- KVStore OP
- Client(含对比)
- RPC OP
- MultiRPC OP
- KVStore OP
- Multi-KVStore OP
- DistGraph
- ndata
- node_attr_schemes
- _ndata_store
- _client._data_store
- _ntype_map
- _get_ndata_names
- node_split
- even or uneven
- force_even=False
- force_even=True
- DisEmbedding
- SparseAdagrad
- DistTensor
- initialization
- _name and _part_policy
- add as DistGraph feature
- add as DistGraph feature with specific policy
- reference to one that exits
- 多次定义
- About shared_memory
- Multi-Client and trainers
- partition and node_split
- About role in DGL
- multiprocessing.Manager
- Standalone mode
- Heterogenrous Graph
DistGraph Server and Client
Server(含对比)
这里面的Server的启动方法直接采用DGL自带的DistGraphServer
来启动,看代码
def run_server(graph_name, serv_id, num_servers, num_clients, shared_mem):from dgl.distributed import DistGraphServerg = DistGraphServer(server_id=serv_id, ip_config="kv_ip_config.txt",num_servers = num_servers, num_clients = num_clients,part_config="dist_graph/{}.json".format(graph_name),disable_shared_mem=not shared_mem,graph_format=['csc', 'coo'])print('start server', serv_id)g.start()
DistGraphServer
为KVServer
的子类,在该类里定义了一些backup_server,shared_memory以及load_partition,init_data,差不多类似于之前的,来看这个start
函数
def start(self):""" Start graph store server."""# start serverserver_state = ServerState(kv_store=self, local_g=self.client_g, partition_book=self.gpb)print('start graph service on server {} for part {}'.format(self.server_id, self.part_id))start_server(server_id=self.server_id,ip_config=self.ip_config,num_servers=self.num_servers,num_clients=self.num_clients, server_state=server_state)
熟悉的配方,都是先ServerState
再start_server
,通过这样来启动server。
再来看看之前在RPC OP和KVStore OP中的server定义方式。
RPC OP
def start_server(num_client, ip_config, server_id = 0):import timeprint("Sleep 2 seconds to test client re-connect")time.sleep(2)server_state = dgl.distributed.ServerState(None, local_g=None, partition_book=None)dgl.distributed.register_service(HELLO_SERVICE_ID, HelloRequest, HelloResponse)print("Start server {}".format(server_id))dgl.distributed.start_server(server_id = server_id,ip_config = ip_config,num_servers= 1 ,num_clients= num_client,server_state = server_state)
非常简单地使用start_server
,ServerState
中的参数什么都没定义,因为并没有涉及任何数据库交互的过程,只是单纯传递信息。
KVStore OP
def start_server(server_id, num_clients, num_servers):import timeprint("Sleep 5 seconds to test client re-connect")time.sleep(5)kvstore = dgl.distributed.KVServer(server_id = server_id,ip_config="kv_ip_config.txt",num_servers = num_servers,num_clients = num_clients)kvstore.add_part_policy(node_policy)kvstore.add_part_policy(edge_policy)if kvstore.is_backup_server():kvstore.init_data('data_0', 'node:_N')kvstore.init_data('data_0_1', 'node:_N')kvstore.init_data('data_0_2', 'node:_N')kvstore.init_data('data_0_3', 'node:_N')else: kvstore.init_data('data_0', 'node:_N', data_0)kvstore.init_data('data_0_1', 'node:_N', data_0_1)kvstore.init_data('data_0_2', 'node:_N', data_0_2)kvstore.init_data('data_0_3', 'node:_N', data_0_3)server_state = dgl.distributed.ServerState(kv_store = kvstore, local_g=None, partition_book=None)dgl.distributed.start_server(server_id = server_id,ip_config="kv_ip_config.txt",num_servers = num_servers,num_clients = num_clients,server_state = server_state)
定义了数据库并初始化了一些数据库的索引内容,但是没有存图。
Client(含对比)
这里使用initialize
和DIstGraph
来启动一个client
def run_client(graph_name, part_id, num_servers, num_clients, num_nodes, num_edges):import osfrom dgl.distributed import load_partition_book,DistGraphos.environ['DGL_NUM_SERVER'] = str(num_servers)dgl.distributed.initialize('kv_ip_config.txt')gpb, graph_name,_ , _ = load_partition_book('dist_graph/{}.json'.format(graph_name), part_id, None)print(graph_name)g= DistGraph(graph_name, gpb)check_dist_emb(g, num_clients, num_nodes, num_edges)
其中initialize
中比较重要的就是使用connect_to_server
来连接到Server,此外DistGraph
在_init()
中会调用get_kvstore()
.此外还会调用_get_graph_from_shared_mem
从server拿到一个graph,这个graph没有feature tensor但是有’inner_node’和’inner_edge’以及node/edge的ID。
另外,这个DistGraph
非常重要,单独放在下一节讲。
RPC OP
def start_client(ip_config):from numpy.testing import assert_array_equaldgl.distributed.register_service(HELLO_SERVICE_ID, HelloRequest, HelloResponse)dgl.distributed.connect_to_server(ip_config = ip_config, num_servers=1)
这里面只是使用connect_to_server
连接到了Server端,这样就可以通过rpc传递已经注册的Request并接受Response。
MultiRPC OP
- 当时的bug还没解决
KVStore OP
def start_client(num_clients, num_servers):import osimport timeos.environ['DGL_DIST_MODE'] = 'distributed'dgl.distributed.initialize("kv_ip_config.txt")kvclient = dgl.distributed.KVClient("kv_ip_config.txt",num_servers = num_servers)kvclient.map_shared_data(partition_book=gpb)
这里使用了initialize
来连接和KVClient
来启动一个KV数据库client。值得注意的是,这里的map_shared_data
中的gpb
其实是全局变量,等于说这里的shared memory应该是同一台机器的gpb。
Multi-KVStore OP
def start_client_mul_role(i, config):import osimport timeos.environ['DGL_DIST_MODE'] = 'distributed'dgl.distributed.initialize(config)if i==0:time.sleep(5)kvclient = dgl.distributed.kvstore.get_kvstore()kvclient.barrier()print(kvclient.client_id, kvclient.role, kvclient.machine_id)print(dgl.distributed.get_num_client())print("i: %d role: %s" % (i, kvclient.role))assert dgl.distributed.role.get_num_trainers() == 2assert dgl.distributed.role.get_trainer_rank() < 2print('trainer rank: %d, global rank: %d' % (dgl.distributed.role.get_trainer_rank(),dgl.distributed.role.get_global_rank()))dgl.distributed.exit_client()
这里通过get_store()
来获取initialize
中定义初始化的KVClient
客户端,每个Client都一个role方法,machine_id以及client_id,这些都在init_role
中定义。用以区分Sampler Client和Trainer Client。
DistGraph
DistGraph其实就是分布式中的DGL Graph,且运行在Client上。关于它和partition的关系,DGL 这样说道:
DistGraph provides a global view of the distributed graph. Internally,
it may contains a partition of the graph if it is co-located with
the server. When servers and clients run on separate sets of machines,
this returns None.
这是DistGraph的local_partition
属性,其返回值也就是self._g
,而这个图就是从server端通过_get_graph_from_shared_mem
拿到的图。这也再次证明了这里的shared memory应该就是针对同一个机器上的。
此外NodeDataView和EdgeDataView可以帮助我们看到Graph的ndata和edata。
- 虽然前面提到
KVClient.map_shared_data(gpb)
,但是这个函数究竟有什么用,是所有Client都是共享的还是?这个gpb在分布式训练时什么时候读进去?都需要再研究研究。 - 参阅下面about shared_memory一节
ndata
取feature(通过NodeDataView类),例如
g.ndata['feature_name']
node_attr_schemes
取node属性scheme(方案),只有名字没有具体feature值
DGL distgraph store OP相关推荐
- 2000-2020全要素生产率OP法+LP法+OLS和固定效应法三种方法合集含原始数据和计算过程Stata代码
2000-2020全要素生产率OP法+LP法+OLS和固定效应法三种方法合集含原始数据和计算过程Stata代码 1.时间:OP法:2008-2020年.LP法2000-2020年.OLS和固定效应法2 ...
- Respo 快速入门
本文使用了 Respo 低版本的 API, 新版本的写法请参考英文版本或者官网 需要的区别是 mutate! 已经用 cursor 的方案替代了. 喜欢英文的同学可以直接看 GitHub https: ...
- Linux内核中的汇编语言
AT&T的汇编格式 在intel格式中大多使用大写字母,而AT&T格式中使用小写字母. 在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀:而在 Intel 汇编格式中 ...
- 代码审计之百家cms
文章目录 前言 一.本地项目部署 二.漏洞挖掘 1.准备 2.存储型XSS 3.SQL注入 4.任意路径删除 5.任意文件删除 6.远程文件上传 7.命令执行 三.总结 前言 百家cms微商城是一款免 ...
- PHP代码审计--百家CMS4.1.4项目实战(下)
PHP代码审计--百家CMS4.1.4项目实战(下) 这是百家cms的第二部分-代码审计 关于百家cms的安装配置及黑盒测试,可以参考上一篇文章: PHP代码审计--百家CMS4.1.4项目实战(上) ...
- 我的世界(2)-服务器菜单(Chestcommands插件)
文章目录 前言 相关介绍 上一篇笔记 下一篇笔记 一.指令 二.权限 三.菜单设置 四.按钮设置 五.其他的按钮配置项 前言 Minecraft沙盒游戏,它不单单可以让玩家游戏,玩家还能自己创建MC的 ...
- 《浅谈Cache Memory》 学习-第四章
Cache的层次结构 我第一次接触存储器瓶颈这个话题是在上世纪九十年代,距今已接近二十年.至今这个问题非但没有缓和的趋势,却愈演愈烈,进一步发展为Memory Wall.在这些问题没有得到解决之前,片 ...
- php代码审计的挖掘思路
工具 这里我使用的是seay源代码审计系统 下载传送门 路由分析 什么是路由? 一个网站有许多不同的功能点,就像路由器一样知道这个网络的走向是在哪里.分析好路由走向有助于更好审计代码 如何发现路由 部 ...
- 用C语言构建简单的石墨烯六边形模型(附带边界条件)
一个非常简单的石墨烯模型构建,可以做一些小的分子动力学模拟.六边形模型很容易构造,关键是处理周期边界上的原子.可供物理学,材料学方面的本科生和硕士低年级参考. 效果图: 头文件head.h: #def ...
最新文章
- 多线程下ArrayList类线程不安全的解决方法及原理
- 将十六进制的字符串转换成整数
- linux系统下springboot jar方式启动后允许后台运行
- 八大基本数据类型对应的八大包装类(含对应面试题解析)
- Oracle查找包共用,oracle – 用于查找包的多级依赖关系的脚本
- php在数据库中上传图片格式,如何上传图片并在php中保存数据库中的URL
- linux下mkdir头文件_Linux中判断一个目录是否存在,如果不存在就创建这个目录
- python离线安装pip出现timeout_Python pip安装包出现timeout的解决办法,修改国内的镜像源...
- 禁用计算机f1-f12,win10禁用F1至F12热键转为功能键的技巧
- 雷军穿上印度传统服装:网友以为《西游记》拍新版了 这画面感受下
- java实现千米与经纬度度数的转换(画圆左右有精度缺失)
- 电商有可能决定一个工厂的生死存亡
- 华为odjava机试题_华为机试题及答案
- 分类模型中准确率、敏感度、特异度的理解
- 怎么查看视频的md5值
- h5 神策埋点_神策埋点
- emoji 原生表情解析成对应表情包png
- 希望计算机专业同学都知道这些老师
- 血战力扣752.打开转盘锁
- 三菱fx2n64mr说明书_三菱FX2N-64MT-D手册FX2N-64MT-D使用说明书 - 广州凌控