dmlc--dgl
ae8dbe6d3c
* Split NCCL wrapper from sparse optimizer and sparse embedding * Add more unit tests for single node nccl * Fix unit test for tf * Switch to device histogram * Fix histgram issues * Finish migration to histogram * Handle cases with zero send/recieve data * Start on partition object * Get compiling * Updates * Add unit tests * Switch to partition object * Fix linting issues * Rename partition file * Add python doc * Fix python assert and finish doxygen comments * Remove stubs for range based partition to satisfy pylint * Wrap unit test in GPU only * Wrap explicit cuda call in ifdef * Merge with partition.py * update docstrings * Cleanup partition_op * Add Workspace object * Switch to using workspace object * Move last remainder based function out of nccl_api * Add error messages * Update docs with examples * Fix linting erros Co-authored-by: xiang song(charlie.song) <classicxsong@gmail.com>
60 行
1.7 KiB
Python
60 行
1.7 KiB
Python
from dgl.cuda import nccl
|
|
from dgl.partition import NDArrayPartition
|
|
import unittest
|
|
import backend as F
|
|
|
|
|
|
def gen_test_id():
|
|
return '{:0256x}'.format(78236728318467363)
|
|
|
|
@unittest.skipIf(F._default_context_str == 'cpu', reason="NCCL only runs on GPU.")
|
|
def test_nccl_id():
|
|
nccl_id = nccl.UniqueId()
|
|
text = str(nccl_id)
|
|
nccl_id2 = nccl.UniqueId(id_str=text)
|
|
|
|
assert nccl_id == nccl_id2
|
|
|
|
nccl_id2 = nccl.UniqueId(gen_test_id())
|
|
|
|
assert nccl_id2 != nccl_id
|
|
|
|
nccl_id3 = nccl.UniqueId(str(nccl_id2))
|
|
|
|
assert nccl_id2 == nccl_id3
|
|
|
|
|
|
@unittest.skipIf(F._default_context_str == 'cpu', reason="NCCL only runs on GPU.")
|
|
def test_nccl_sparse_push_single():
|
|
nccl_id = nccl.UniqueId()
|
|
comm = nccl.Communicator(1, 0, nccl_id)
|
|
|
|
index = F.randint([10000], F.int32, F.ctx(), 0, 10000)
|
|
value = F.uniform([10000, 100], F.float32, F.ctx(), -1.0, 1.0)
|
|
|
|
part = NDArrayPartition(10000, 1, 'remainder')
|
|
|
|
ri, rv = comm.sparse_all_to_all_push(index, value, part)
|
|
assert F.array_equal(ri, index)
|
|
assert F.array_equal(rv, value)
|
|
|
|
@unittest.skipIf(F._default_context_str == 'cpu', reason="NCCL only runs on GPU.")
|
|
def test_nccl_sparse_pull_single():
|
|
nccl_id = nccl.UniqueId()
|
|
comm = nccl.Communicator(1, 0, nccl_id)
|
|
|
|
req_index = F.randint([10000], F.int64, F.ctx(), 0, 100000)
|
|
value = F.uniform([100000, 100], F.float32, F.ctx(), -1.0, 1.0)
|
|
|
|
part = NDArrayPartition(100000, 1, 'remainder')
|
|
|
|
rv = comm.sparse_all_to_all_pull(req_index, value, part)
|
|
exp_rv = F.gather_row(value, req_index)
|
|
assert F.array_equal(rv, exp_rv)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
test_nccl_id()
|
|
test_nccl_sparse_push_single()
|
|
test_nccl_sparse_pull_single()
|