#5 - 메모리의 점진적인 누수
파티클의 갯수 4000개 epochs 100회 기준 최종적으로 150GB 의 메모리 사용량을 보인다
하지만 초기의 메모리는 26GB 로 점진적으로 메모리의 사용량이 증가하는것으로 볼 수 있다
This commit is contained in:
jung-geun
2023-09-04 14:07:22 +09:00
parent e5f364c3b2
commit 727ae8c604
5 changed files with 15661 additions and 19 deletions

View File

@@ -2,5 +2,4 @@
"[python]": { "[python]": {
"editor.defaultFormatter": "ms-python.black-formatter" "editor.defaultFormatter": "ms-python.black-formatter"
}, },
"python.formatting.provider": "none"
} }

View File

@@ -210,6 +210,9 @@ best_score = pso_mnist.fit(
![mnist_acc](./history_plt/mnist_63.84_acc.png) ![mnist_acc](./history_plt/mnist_63.84_acc.png)
![mnist_loss](./history_plt/mnist_63.84_loss.png) ![mnist_loss](./history_plt/mnist_63.84_loss.png)
63%의 정확도가 나타나는 것으로 보아 최적화가 되어가고 있다고 볼 수 있을 것 같습니다.
하지만 정확도가 더 이상 올라가지 않고 정체되는 것으로 보아 조기 수렴하는 문제가 발생하고 있다고 생각합니다.
## Trouble Shooting ## Trouble Shooting
> 1. 딥러닝 알고리즘 특성상 weights는 처음 컴파일시 무작위하게 생성된다. weights의 각 지점의 중요도는 매번 무작위로 정해지기에 전역 최적값으로 찾아갈 때 값이 높은 loss를 향해서 상승하는 현상이 나타난다.</br> > 1. 딥러닝 알고리즘 특성상 weights는 처음 컴파일시 무작위하게 생성된다. weights의 각 지점의 중요도는 매번 무작위로 정해지기에 전역 최적값으로 찾아갈 때 값이 높은 loss를 향해서 상승하는 현상이 나타난다.</br>
@@ -226,9 +229,14 @@ best_score = pso_mnist.fit(
-> keras 모델을 사용할때 predict, evaluate 함수를 사용하면 메모리 누수가 발생하는 문제를 찾았습니다. 해결방법을 추가로 찾아보는중 입니다. -> 메모리 누수를 획기적으로 줄여 현재는 파티클의 수를 500개에서 1000개까지 증가시켜도 문제가 없습니다.</br> -> keras 모델을 사용할때 predict, evaluate 함수를 사용하면 메모리 누수가 발생하는 문제를 찾았습니다. 해결방법을 추가로 찾아보는중 입니다. -> 메모리 누수를 획기적으로 줄여 현재는 파티클의 수를 500개에서 1000개까지 증가시켜도 문제가 없습니다.</br>
-> 추가로 파티클의 수가 적을때에도 전역 최적해를 쉽게 찾는 방법을 찾는중 입니다</br> -> 추가로 파티클의 수가 적을때에도 전역 최적해를 쉽게 찾는 방법을 찾는중 입니다</br>
> 4. 모델의 크기가 커지면 수렴이 늦어지고 정확도가 떨어지는 현상이 발견되었다. 모델의 크기에 맞는 파라미터를 찾아야할 것 같다. > 4. 현재 tensorboard 로 로그 저장시 994개 이상 저장이 안되는 문제가 발생하고 있습니다.
> 5. EBPSO 의 방식을 추가로 적용을 하였으나 수식을 잘못 적용을 한것인지 기본 pso 보다 더 떨어지는 정확도를 보이고 있다. (현재 수정중) -> csv 파일로 저장할 경우 갯수에는 문제가 발생하지 않습니다.
-> 수가 적을때 한 파티클이 지역 최적해에서 머무를 경우 파티클을 초기화 하는 방법이 필요해 보입니다.
> 5. 모델의 크기가 커지면 수렴이 늦어지고 정확도가 떨어지는 현상이 발견되었다. 모델의 크기에 맞는 파라미터를 찾아야할 것 같다.
> 6. EBPSO 의 방식을 추가로 적용을 하였으나 수식을 잘못 적용을 한것인지 기본 pso 보다 더 떨어지는 정확도를 보이고 있다. (현재 수정중)
### 개인적인 생각 ### 개인적인 생각

View File

@@ -104,11 +104,11 @@ loss = [
pso_mnist = optimizer( pso_mnist = optimizer(
model, model,
loss="mean_squared_error", loss="mean_squared_error",
n_particles=990, n_particles=2000,
c0=0.2, c0=0.2,
c1=0.4, c1=0.4,
w_min=0.3, w_min=0.3,
w_max=0.6, w_max=0.7,
negative_swarm=0.1, negative_swarm=0.1,
mutation_swarm=0.3, mutation_swarm=0.3,
particle_min=-4, particle_min=-4,
@@ -118,15 +118,16 @@ pso_mnist = optimizer(
best_score = pso_mnist.fit( best_score = pso_mnist.fit(
x_train, x_train,
y_train, y_train,
epochs=200, epochs=300,
save_info=True, save_info=True,
log=2, log=1,
log_name="mnist", log_name="mnist",
save_path="./result/mnist", save_path="./logs/mnist",
renewal="acc", renewal="acc",
check_point=25, check_point=25,
empirical_balance=False, empirical_balance=False,
dispersion=False, dispersion=False,
) )
print("Done!") print("Done!")

15644
plt.ipynb

File diff suppressed because one or more lines are too long

View File

@@ -130,8 +130,6 @@ class Optimizer:
sys.exit("Ctrl + C : Stop Training") sys.exit("Ctrl + C : Stop Training")
except MemoryError: except MemoryError:
sys.exit("Memory Error : Stop Training") sys.exit("Memory Error : Stop Training")
except Exception as e:
sys.exit(e)
def __del__(self): def __del__(self):
del self.model del self.model
@@ -245,7 +243,7 @@ class Optimizer:
x : numpy array, x : numpy array,
y : numpy array, y : numpy array,
epochs : int, epochs : int,
log : int - 0 : log 기록 안함, 1 : log, 2 : tensorboard, log : int - 0 : log 기록 안함, 1 : csv, 2 : tensorboard,
save_info : bool - 종료시 학습 정보 저장 여부 default : False, save_info : bool - 종료시 학습 정보 저장 여부 default : False,
save_path : str - ex) "./result", save_path : str - ex) "./result",
renewal : str ex) "acc" or "loss" or "both", renewal : str ex) "acc" or "loss" or "both",
@@ -258,7 +256,7 @@ class Optimizer:
self.dispersion = dispersion self.dispersion = dispersion
self.renewal = renewal self.renewal = renewal
particle_sum = 0 # x_j particle_sum = 0 # x_j
try: try:
train_log_dir = "logs/fit/" + self.day train_log_dir = "logs/fit/" + self.day
if log == 2: if log == 2:
@@ -277,10 +275,8 @@ class Optimizer:
self.save_path = save_path self.save_path = save_path
if not os.path.exists(f"{save_path}/{self.day}"): if not os.path.exists(f"{save_path}/{self.day}"):
os.makedirs(f"{save_path}/{self.day}", exist_ok=True) os.makedirs(f"{save_path}/{self.day}", exist_ok=True)
except ValueError as e: except ValueError as ve:
sys.exit(e) sys.exit(ve)
except Exception as e:
sys.exit(e)
for i in tqdm(range(self.n_particles), desc="Initializing velocity"): for i in tqdm(range(self.n_particles), desc="Initializing velocity"):
p = self.particles[i] p = self.particles[i]