본문 바로가기

DL & ML/Graph

[DGL] local_scope란?

728x90
반응형

dgl 라이브러리를 사용한 그래프를 다루는 함수 중에서

with graph.local_scope() 라는 코드가 종종 보입니다!

이 코드는 무슨 역할을 해주는 코드일까요?

 

 

dgl.DGLGraph.local_scope — DGL 0.7.2 documentation

© Copyright 2018, DGL Team. Revision de0eb209.

docs.dgl.ai

 

공식 문서를 참고 해보면 local_scope 내에서 그래프를 변형할 경우 실제 그래프에 반영이 되지 않는다고 합니다!

 

예시를 통해 한 번 살펴볼까요?

 

자, 다음과 같은 그래프가 있다고 가정해봅시다!

 

>>> g = dgl.graph((torch.tensor([0, 1, 1]), torch.tensor([0, 0, 2])))
>>> g
Graph(num_nodes=3, num_edges=3,
      ndata_schemes={}
      edata_schemes={})

 

이때, edata['h']를 추가해주는 함수 test를 만들어봅니다.

 

def test(g) :
    g.edata['h'] = torch.ones((g.num_edges()), 3)

 

test 함수에 g를 넣어보면 따로 반환을 받지 않아도 그래프 g에 edata가 추가된 것을 확인할 수 있습니다!

 

>>> test(g)
>>> g
Graph(num_nodes=3, num_edges=3,
      ndata_schemes={}
      edata_schemes={'h': Scheme(shape=(3,), dtype=torch.float32)})

 

그런데 만약! 원본 그래프를 전혀 건들고 싶지않다면?

이때 local_scope를 사용해주면 됩니다!

 

다음과 같이 local_scope를 추가한 test 함수에 그래프 g를 넣어보면

def test(g) :
    with g.local_scope() :
        g.edata['h'] = torch.ones((g.num_edges()), 3)

 

그래프에 edata가 추가되지 않은 것을 확인할 수 있습니다!

 

>>> test(g)
>>> g
Graph(num_nodes=3, num_edges=3,
      ndata_schemes={}
      edata_schemes={})

 

 

필요에 따라서 local_scope 기능을 사용해주면 됩니다!!

주로 학습하는 과정 속에서 학습 데이터 그래프의 구성이 변하면 안되므로 local_scope을 함께 사용해주어야 합니다.

728x90
반응형