callmonitor 기능 호출을 모니터링하고 로그하는 간단한 도구 pip install callmonitor또는이 저장소를 복제하고 :
python setup.py install 사용하기가 간단하고 @intercept 데코레이터로 기능을 장식합니다. 예 : :
from callmonitor import intercept
@ intercept
def test_fn_2 ( x , y = 2 , z = 3 ):
pass 이렇게하면 call-monitor/test_fn_2/<invocation count> 와 함께 입력 ( args , kwargs 및 callmonitor.DB )과 함께 입력 (Args, Kwargs 및 argspec )이 저장됩니다.
callmonitor 출력을 덮어 쓰지 않습니다 call-monitor 폴더가 이미 존재하는 경우 (예 : 이전 실행), 새로운 폴더 call-monitor-1 또는 call-monitor-2 등이 생성됩니다. 이 데이터가 저장되는 방법 에 대한 자세한 내용은 Data Structure 섹션을 참조하십시오.
callmonitor 쓰기부터 같은 위치에 다른 프로세스를 피하기 위해 -tid=<N> 루트 ( call-monitor ) 폴더에 추가됩니다. 현재 callmonitor 상자에서 mpi4py 지원합니다. if mpi4py.MPI.COMM_WORLD.Get_rank() > 1 , callmonitor 자동으로 IM 다중 스레드 모드를 실행 중이며 -tid=<Get_rank()> 출력에 추가한다고 가정합니다. 프로그램이 다른 framwork (예 : concurrent.Futures )로 다중 스레드 인 경우 callmonitor.Settings : 콜몬이 ID를 사용하여 callmonitor 알려야합니다.
from callmonitor import Settings
settings = Settings ()
settings . enable_multi_threading ( THREAD_ID ) intercept 의 첫 번째 호출 (데이터베이스가 처음 필요한 경우 디스크에서 생성되기 전에 callmonitor.Settings 읽는 시점에 있습니다. callmonitor.Settings 는 데이터베이스가 다시 작성되는 경우에만 발효됩니다. callmonitor.CONTEXT.new ).
Handler 등록 s 때때로 pickle 기능 입력 저장 측면에서 절단하지 않습니다. 우리 자신의 멋진 데이터 유형을 저장해야 할 때. callmonitor 다운 인수 처리기를 구축하고 Global callmonitor.REGISTRY 에 등록하는 방법을 제공합니다. 레지스트리는 매번 기능 입력이 처리 될 때마다 쿼리됩니다. 따라서 자신의 ArgHandler 만들고 callmonitor.REGISTRY.add 를 사용하면 해당 시점부터 관련 데이터 유형의 인수를 처리합니다. 예를 들어 numpy 자체 save / load 기능을 제공합니다. 우리는 이미 Numpy Arggument Handler를 구축하고 등록했습니다.
import numpy as np
from os . path import join
from callmonitor import Handler , REGISTRY
class NPHandler ( Handler ):
def load ( self , path ):
self . data = np . load ( join ( path , f"arg_ { self . target } .npy" ))
def save ( self , path ):
np . save ( join ( path , f"arg_ { self . target } .npy" ), self . data )
@ classmethod
def accumulator_done ( cls ):
pass
REGISTRY . add ( np . ndarray , NPHandler ) (이 특정 Handler 필요한 @intercept 의 첫 번째 호출 전에 callmonitor.REGISTRY.add 호출해야합니다. 사용자 정의 핸들러는 callmonitor.Handler 클래스를 상속하고 save , load 및 accumulator_done (마지막 @classmethod )을 상속해야합니다.
callmonitor.load(<path>) 는 <path> 에 데이터베이스를로드합니다 ( Data Structure 섹션 참조). 예 : :
from callmonitor import load
db = load ( "call-monitor" ) 이제 DB.get 사용하여 데이터베이스에서 개별 기능 호출 데이터를 얻을 수 있습니다.
args , kwargs = db . get ( "function_name" , invocation_count ) (또한 .npy 파일 및 모든 사용자 정의 처리기를 자동으로로드합니다. db.get 실행하기 전에 callmonitor.REGISTRY 에 등록해야합니다)
기억하십시오 : invocation_count 1에서 시작합니다. 따라서 첫 번째 호출 test_np_1 에 액세스하고 실행하십시오.
In [ 4 ]: db . get ( "test_np_1" , 1 )
Out [ 4 ]: ([ 10 , array ([ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ])], {})callmonitor 와 상호 작용합니다우리는 다음 사용자를 대상으로하는 클래스의 최상위 요약을 활성화하려고 노력합니다.
REGISTRYDBDB.get_args 및 __str__ 및 __repr__ 함수를 통한 Args . 예를 들어, callmonitor.REGISTRY 어떤 데이터 유형/핸들러 쌍이 구성되는지 보여줍니다. In [ 2 ]: callmonitor . REGISTRY
Out [ 2 ]:
{
< class 'numpy.ndarray' > : < class 'callmonitor.handler.NPHandler' >
} 마찬가지로 DB 객체는 호출 된 기능 요약 및 빈도를 표시합니다.
In [ 3 ]: db = callmonitor . load ( "call-monitor" )
In [ 4 ]: db
Out [ 4 ]:
{
Locked : True
test_np_1 : {
calls : 2
args : [ 'x' , 'n' ]
defaults : None
}
}Args 컨테이너 args , kwargs 및 argspec.defaults 선택하는 것은 특히 특정 인수의 가치를 찾으려고하는 경우 매우 지루할 수 있습니다. 따라서 callmonitor.DB Args 객체를 반환하는 addittl getter get_args 제공합니다. callmonitor.Args 는 각 입력 인수를 이름별로 저장하는 컨테이너 클래스입니다. 예 : :
In [ 3 ]: args = db . get_args ( "test_fn_1" , 1 )
In [ 4 ]: args
Out [ 4 ]: dict_keys ([ 'x' , 'y' , 'z' ])
In [ 5 ]: args . x
Out [ 5 ]: 1 참고 : callmonitor.Args 생성자는 FullArgSpec 기본값의 args 및 kwargs 가 아닌 인수를 채 웁니다. 원래 함수를 재현하려면 callmonitor.DB.get 에 의해 반환 된 args 와 kwargs 충분해야합니다.
기술적으로 데이터베이스는 아니지만 더 나은 용어가 부족하기 위해 callmonitor 에서 생성 한 디렉토리를 데이터베이스에 호출하십시오. 각 데이터베이스는 db.pkl 파일 (메타 데이터 포함)과 각 함수의 폴더 (각 기능 호출이 열거 됨)로 구성됩니다. 예 : :
call-monitor
├── db.pkl
├── test_fn_1
│ ├── 1
│ │ └── input_descriptor.pkl
│ └── 2
│ └── input_descriptor.pkl
└── test_fn_2
└── 1
└── input_descriptor.pkl
numpy 입력에 특별한주의를 기울여야합니다. 이는 arg_<label>.npy 라고하며, 여기서 <label> 은 입력 인수의 색인이거나 Kwargs의 kw . 예 : :
call-monitor
├── db.pkl
└── test_np_1
├── 1
│ ├── arg_1.npy
│ └── input_descriptor.pkl
└── 2
├── arg_n.npy
└── input_descriptor.pkl
단일 데이터 구조 ( 실제 데이터베이스)로 모든 통화 데이터를 저장하는 것이 전적으로 고려되었지만,이를 효율적으로 규모로 수행하는 것은 쉽지 않으며이 패키지를 번거롭게 만들 수 있습니다. 향후 버전에는 다수의 작은 파일을 피하기 위해 여러 개의 작은 함수 호출을 단일 어큐뮬레이터 객체에 융합시키는 기능이 포함됩니다.
버전 0.3.0은 callmonitor 에 대한 많은 개선 사항을 브릿합니다. 따라서 우리는 더 이상 기본 후진 호환성을 가능하게 할 수 없었습니다. 버전 0.2.0 데이터베이스를 버전 0.3.0 (또는 이후)으로 변환 할 수있는 도구가 현재 개발 중입니다. 0.2.0 사전 데이트 버전은 더 이상 지원되지 않습니다.