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()

DistGraphServerKVServer的子类,在该类里定义了一些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)

熟悉的配方,都是先ServerStatestart_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_serverServerState中的参数什么都没定义,因为并没有涉及任何数据库交互的过程,只是单纯传递信息。

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(含对比)

这里使用initializeDIstGraph来启动一个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相关推荐

  1. 2000-2020全要素生产率OP法+LP法+OLS和固定效应法三种方法合集含原始数据和计算过程Stata代码

    2000-2020全要素生产率OP法+LP法+OLS和固定效应法三种方法合集含原始数据和计算过程Stata代码 1.时间:OP法:2008-2020年.LP法2000-2020年.OLS和固定效应法2 ...

  2. Respo 快速入门

    本文使用了 Respo 低版本的 API, 新版本的写法请参考英文版本或者官网 需要的区别是 mutate! 已经用 cursor 的方案替代了. 喜欢英文的同学可以直接看 GitHub https: ...

  3. Linux内核中的汇编语言

    AT&T的汇编格式 在intel格式中大多使用大写字母,而AT&T格式中使用小写字母. 在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀:而在 Intel 汇编格式中 ...

  4. 代码审计之百家cms

    文章目录 前言 一.本地项目部署 二.漏洞挖掘 1.准备 2.存储型XSS 3.SQL注入 4.任意路径删除 5.任意文件删除 6.远程文件上传 7.命令执行 三.总结 前言 百家cms微商城是一款免 ...

  5. PHP代码审计--百家CMS4.1.4项目实战(下)

    PHP代码审计--百家CMS4.1.4项目实战(下) 这是百家cms的第二部分-代码审计 关于百家cms的安装配置及黑盒测试,可以参考上一篇文章: PHP代码审计--百家CMS4.1.4项目实战(上) ...

  6. 我的世界(2)-服务器菜单(Chestcommands插件)

    文章目录 前言 相关介绍 上一篇笔记 下一篇笔记 一.指令 二.权限 三.菜单设置 四.按钮设置 五.其他的按钮配置项 前言 Minecraft沙盒游戏,它不单单可以让玩家游戏,玩家还能自己创建MC的 ...

  7. 《浅谈Cache Memory》 学习-第四章

    Cache的层次结构 我第一次接触存储器瓶颈这个话题是在上世纪九十年代,距今已接近二十年.至今这个问题非但没有缓和的趋势,却愈演愈烈,进一步发展为Memory Wall.在这些问题没有得到解决之前,片 ...

  8. php代码审计的挖掘思路

    工具 这里我使用的是seay源代码审计系统 下载传送门 路由分析 什么是路由? 一个网站有许多不同的功能点,就像路由器一样知道这个网络的走向是在哪里.分析好路由走向有助于更好审计代码 如何发现路由 部 ...

  9. 用C语言构建简单的石墨烯六边形模型(附带边界条件)

    一个非常简单的石墨烯模型构建,可以做一些小的分子动力学模拟.六边形模型很容易构造,关键是处理周期边界上的原子.可供物理学,材料学方面的本科生和硕士低年级参考. 效果图: 头文件head.h: #def ...

最新文章

  1. 多线程下ArrayList类线程不安全的解决方法及原理
  2. 将十六进制的字符串转换成整数
  3. linux系统下springboot jar方式启动后允许后台运行
  4. 八大基本数据类型对应的八大包装类(含对应面试题解析)
  5. Oracle查找包共用,oracle – 用于查找包的多级依赖关系的脚本
  6. php在数据库中上传图片格式,如何上传图片并在php中保存数据库中的URL
  7. linux下mkdir头文件_Linux中判断一个目录是否存在,如果不存在就创建这个目录
  8. python离线安装pip出现timeout_Python pip安装包出现timeout的解决办法,修改国内的镜像源...
  9. 禁用计算机f1-f12,win10禁用F1至F12热键转为功能键的技巧
  10. 雷军穿上印度传统服装:网友以为《西游记》拍新版了 这画面感受下
  11. java实现千米与经纬度度数的转换(画圆左右有精度缺失)
  12. 电商有可能决定一个工厂的生死存亡
  13. 华为odjava机试题_华为机试题及答案
  14. 分类模型中准确率、敏感度、特异度的理解
  15. 怎么查看视频的md5值
  16. h5 神策埋点_神策埋点
  17. emoji 原生表情解析成对应表情包png
  18. 希望计算机专业同学都知道这些老师
  19. 血战力扣752.打开转盘锁
  20. 三菱fx2n64mr说明书_三菱FX2N-64MT-D手册FX2N-64MT-D使用说明书 - 广州凌控

热门文章

  1. 信号处理趣学D1——相关函数的意义利用自相关函数消除噪声
  2. 【开源硬件】STM32F030R8T6系统板
  3. 《App Store创赢艺术》读后感
  4. 小觅双目摄像头D1000-IR-120/Color模组评测(上)
  5. 百度智能云OCR身份证识别-SDK
  6. 《面朝大海,春暖花开》诗歌
  7. 读书笔记-精准努力-读这段话自身写照 读书改变命运
  8. Cinemachine Collider
  9. 火狐浏览器各版本下载及插件httprequest
  10. 将数字字符串转换成整数