~/.bashrc 파일에 아래의 문장을 추가해주면 오류가 해결된다.

export OPENBLAS_CORETYPE=ARMV8

 

연구실에 gpu 서버가 들어오게 되면서, 서버의 gpu를  겹치거나 사용하지 못하는 일이 없도록 사용자별로 gpu의 사용 유무를 확인한 후 gpu를 지정하여 머신러닝을 학습시켜야 한다.

이를 위한 gpu 사용 유무 확인 방법 및 gpu를 지정하는 방법을 공유한다.

 

1. gpu 사용 유무 확인

nvidia-smi

위 명령어를 이용하여 아래와 같이 현재 사용중인 gpu와 사용하지 않는 gpu를 확인할 수 있다. (현재는 gpu가 한 개인 환경에서 테스트 하므로 gpu가 한 개 밖에 없다.)

한 개의 gpu의 89% 및 19417MB를 사용중인것을 확인할 수 있다.

2. gpu 지정

사용하지 않는 gpu를 확인하면 해당 gpu를 지정하여 학습해야한다.

tensorflow를 이용할 때

아래 코드를 이용하여 gpu들을 출력한다.

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
import os
os.environ["CUDA_VISIBLE_DEVICES"]="{gpu_num}";
# ex) 1번 gpu를 사용하고자 할 때
os.environ["CUDA_VISIBLE_DEVICES"]="1";

위의 방법을 이용하여  gpu를 지정하여 사용하여 주길 바란다.

연구실 서버 한 대에서의 gpu를 나눠써야하는 상황이 발생하여, 각각 사용가능한 gpu의 최대 메모리를 제한하여 사용하는 방식을 사용하였다.

 

gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:  # gpu가 존재한다면 MB단위로 제한 (5GB로 제한)
  tf.config.experimental.set_virtual_device_configuration(gpus[0], 
        [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=5*1024)])

위의 코드를 추가하면 메모리가 제한되는 것을 볼 수 있다.

지정해둔 메모리보다 조금 더 사용한다.

 

레이더 센싱 데이터를 이용한 classification 문제에 머신러닝을 이용하고자 하는데, amplitude와 phase 두 attribute의 feature를 1D CNN을 이용하여 각각 추출한 후 모델의 끝에서 다시 병합하여 사용하고자 한다.

Keras에서는 이와 같은 방식의 모델을 구성할 수 있도록 도와주는 functional.api가 존재한다.

The Functional API (keras.io)

 

Keras documentation: The Functional API

The Functional API Author: fchollet Date created: 2019/03/01 Last modified: 2020/04/12 Description: Complete guide to the functional API. View in Colab • GitHub source Setup import numpy as np import tensorflow as tf from tensorflow import keras from ten

keras.io

위 사이트를 참고하여 아래 사진과 같은 모델을 구성해보았다.

VGG를 이용하여 Amplitude와 Phase의 Feature map을 따로 생성한 후 이를 합쳐서 fully connected layer에 연결

 

def VGG_branch(X, Y, test_X, test_Y, cp_filepath, EPOCH=100):
    
    amp_input = keras.Input(shape=(X.shape[2],1), name="amplitude")
    phs_input = keras.Input(shape=(X.shape[2],1), name='phase')
    
    amp_features = layers.Conv1D(64, (3), activation = 'relu', input_shape = (X.shape[2], 1), padding = 'same')(amp_input)
    amp_features = layers.Conv1D(64, (3), activation = 'relu', padding = 'same')(amp_features)
    amp_features = layers.MaxPool1D(2)(amp_features)
    amp_features = layers.Conv1D(128, (3), activation = 'relu', padding = 'same')(amp_features)
    amp_features = layers.Conv1D(128, (3), activation = 'relu', padding = 'same')(amp_features)
    amp_features = layers.MaxPool1D(2)(amp_features)
    amp_features = layers.Conv1D(256,(3), activation = 'relu', padding = 'same')(amp_features)
    amp_features = layers.Conv1D(256,(3), activation = 'relu', padding = 'same')(amp_features)
    amp_features = layers.Conv1D(256,(3), activation = 'relu', padding = 'same')(amp_features)
    amp_features = layers.Conv1D(256,(3), activation = 'relu', padding = 'same')(amp_features)
    amp_features = layers.MaxPool1D(2)(amp_features)
    print(amp_features.shape)
    amp_features = layers.Flatten()(amp_features)

    phs_features = layers.Conv1D(64, (3), activation = 'relu', input_shape = (X.shape[2], 1), padding = 'same')(phs_input)
    phs_features = layers.Conv1D(64, (3), activation = 'relu', padding = 'same')(phs_features)
    phs_features = layers.MaxPool1D(2)(phs_features)
    phs_features = layers.Conv1D(128, (3), activation = 'relu', padding = 'same')(phs_features)
    phs_features = layers.Conv1D(128, (3), activation = 'relu', padding = 'same')(phs_features)
    phs_features = layers.MaxPool1D(2)(phs_features)
    phs_features = layers.Conv1D(256,(3), activation = 'relu', padding = 'same')(phs_features)
    phs_features = layers.Conv1D(256,(3), activation = 'relu', padding = 'same')(phs_features)
    phs_features = layers.Conv1D(256,(3), activation = 'relu', padding = 'same')(phs_features)
    phs_features = layers.Conv1D(256,(3), activation = 'relu', padding = 'same')(phs_features)
    phs_features = layers.MaxPool1D(2)(phs_features)
    print(phs_features.shape)
    phs_features = layers.Flatten()(phs_features)

    x = layers.concatenate([amp_features, phs_features], axis = -1)
    x = layers.Dense(4096, activation = 'relu')(x)
    x = layers.Dense(4096, activation = 'relu')(x)

    material_output = layers.Dense(4, activation = 'softmax', name = 'material_output')(x)

    model = keras.Model(inputs = [amp_input, phs_input],
                        outputs = [material_output],)

    model.summary()
    keras.utils.plot_model(model, "./multi_input_and_output_model.png", show_shapes=True)
    model.compile(optimizer = 'adam', loss = tf.keras.losses.CategoricalCrossentropy(), metrics=['accuracy'])
    checkpoint_filepath = cp_filepath
    callback = tf.keras.callbacks.ModelCheckpoint(
        filepath = './model/' + checkpoint_filepath,
        monitor='val_accuracy',
        mode='max',
        save_best_only = True,
        save_weigths_only = False,
    )

    model.fit(
    {"amplitude": X[:,0,:], "phase": X[:,1,:]},
    {"material_output": Y},
    epochs=EPOCH,
    validation_data = ({"amplitude" : test_X[:,0,:], "phase": test_X[:,1,:]}, {"material_output" : test_Y}),
    callbacks = [callback]
)

 

+ Recent posts