2016-09-23 5 views
3

코드는 Python 형식입니다. 나는 파이썬에서 gensim에 바이너리 모델을로드했다. &은 "init_sims"옵션을 사용하여 실행 속도를 높이었다. OS는 OS X입니다. 로드하는 데는 거의 50-60 초가 걸립니다. 그리고 가장 동등한 시간은 "most_similar"를 찾아야합니다. 이게 정상인가? init_sims 옵션을 사용하기 전에 거의 두 배의 시간이 걸렸습니다! OS RAM 할당 문제 일 수 있다고 생각합니다. 항상 절약 (단위 정규화 벡터를 다시 계산 될 수있는)를 '원시'벡터를 저장하기 때문에 init_sims(replace=True)의 메모리 절약 효과, 저장 /로드 사이클 지속되지 않는Word2Vec : Gensim 및 Google-News 데이터 세트 사용 - 매우 느린 실행 시간

model=Word2Vec.load_word2vec_format('GoogleNewsvectorsnegative300.bin',binary=True) 
model.init_sims(replace=True) 
model.save('SmallerFile') 
#MODEL SAVED INTO SMALLERFILE & NEXT LOAD FROM IT 
model=Word2Vec.load('SmallerFile',mmap='r') 
#GIVE RESULT SER! 
print model.most_similar(positive=['woman', 'king'], negative=['man']) 
+0

훈련시 cbow와 ngram을 전환 해보십시오. – AbtPst

답변

4

참고. 따라서 다시로드 한 후에도 most_similar()을 처음 호출하면 init_sims()이 뒤에서 호출되며 메모리 사용량이 배가됩니다.

그리고 GoogleNews 데이터 세트는 상당히 커서 단위 표준화가 메모리 사용량을 두 배로 늘리기 전에도 3GB 이상을로드해야합니다. 따라서 실행중인 다른 항목과 컴퓨터의 RAM에 따라 most_similar() 계산이 실행될 때 스왑 메모리를 사용하고있을 수 있습니다. 이는 벡터와 정렬 결과와의 유사성에 대해 매우 느립니다 작전. (그럼에도 불구하고 1 일 이후에 어떤 most_similar() 검사는 단위 정규화 벡터 캐시를 다시 입력 할 필요가 없습니다, 그래서 1 호보다 빠르게 이동합니다.)

당신이 init_sims(replace=True) 후 모델을 저장 한 것을 감안할 때, 그 원시 벡터는 이미 단위 정규화되어 있습니다. 그래서 당신은 당신의 load() 후, 재 계산을 건너 뛸 모델을 수동으로 패치 할 수 있습니다 :

model.syn0norm = model.syn0 

그리고 심지어 첫 번째 most_similar() 단지 init_sims()을 유발하지 않고 벡터의 (단일 메모리 매핑) 세트를 협의한다.

여전히 느린 경우 더 많은 메모리가 필요하거나 벡터를 부분 집합으로 트림 할 수 있습니다. GoogleNews 벡터는 가장 빈번한 단어를 가장 빨리 정렬하도록 정렬되어 있으므로 마지막 10 %, 50 %, 심지어 90 %를 버리면 여전히 가장 일반적인 단어 집합이 유용하게 남을 수 있습니다. (모델 객체와 소스 코드를보고이 트리밍을 수행해야합니다.)

마지막으로 가장 가까운 이웃 색인을 사용하여 가장 빠른 상위 N 개의 색인을 얻을 수 있지만 추가 메모리가 필요합니다 그리고 대략적인 결과 (실제 top-N 경기 중 일부를 놓칠 수도 있음). 최근 gensim 버전에 IPython 노트북 자습서가 있는데 annoytutorial.ipynb 데모 IPython 노트북의 IPython 노트북은 docs/notebooks 디렉토리에 있습니다.