Locust를 활용한 IBM watsonx.ai LLM 응답 부하 테스트

Locust는 부하 테스트를 설정하고 실행하기에 매우 유용한 도구다.
Locust를 활용하면 다양한 시스템과 API에 대해 동시성 테스트를 손쉽게 진행할 수 있으며, 웹 기반 UI를 통해 실시간 성능 모니터링도 가능하다.

 

이번 테스트에서는 IBM watsonx.aiLlama 3.1-8b-instruct 모델을 사용해, 여러 사용자가 동시에 API 요청을 보냈을 때 시스템의 응답 성능을 측정했다.

 

1. Locust 스크립트 작성

Locust의 테스트는 Python 스크립트로 작성되며, 가상의 사용자(User)와 이들이 수행할 작업(Task)을 정의한다.
이를 통해 다수의 사용자가 어떻게 시스템에 접근하고, 얼마나 많은 요청을 보내는지를 시뮬레이션할 수 있다.

1.1. HttpUser 클래스

Locust에서 모든 사용자는 HttpUser 클래스를 상속받아 정의된다.
HttpUser는 기본적으로 HTTP 요청을 보내는 사용자를 시뮬레이션하며, 각 사용자가 어떤 행동을 할지 정의하는 데 사용된다.

class APITestUser(HttpUser):
    wait_time = between(1, 5)  # 사용자 요청 간 대기 시간을 1초에서 5초 사이로 설정
  • HttpUser: 이 클래스를 상속받아 각 가상 사용자의 행동을 정의한다. 여기서는 HTTP 요청을 보내는 사용자를 시뮬레이션한다.
  • wait_time: 사용자가 두 작업(Task) 사이에 대기하는 시간을 설정한다. 예를 들어, 위의 예시에서는 각 사용자가 요청을 보낸 후 1초에서 5초 사이에 랜덤하게 대기한다.

1.2. @task 데코레이터

Locust에서 사용자의 행동을 정의하는 것은 @task 데코레이터를 사용하여 이루어진다.
이 데코레이터를 사용해 각 사용자가 수행할 작업(HTTP 요청 등)을 지정한다.

    @task
    def test_api_request(self):
        url = "/ml/v1/text/generation?version=2023-05-29"
        body = {
            "input": "<input_text>",
            "parameters": {
                "decoding_method": "greedy",
                "max_new_tokens": 200,
                "repetition_penalty": 1
            },
            "model_id": "meta-llama/llama-3-1-8b-instruct",
            "project_id": "45ed654d-9cc2-4e2c-9c32-015ee9a310ca"
        }

        headers = {
            "Accept": "application/json",
            "Content-Type": "application/json",
            "Authorization": f"Bearer {access_token}"
        }

        # HTTP POST 요청을 보낸다
        response = self.client.post(url, json=body, headers=headers)

        if response.status_code != 200:
            print(f"Error: {response.status_code}, {response.text}")
  • @task: 이 데코레이터는 사용자가 수행할 작업을 정의하며, 이 작업은 Locust가 시뮬레이션할 때 반복해서 실행된다.
    이 경우, IBM watsonx.ai API에 POST 요청을 보내는 작업을 정의했다.
     
  • self.client.post(): Locust는 내장된 클라이언트(self.client)를 통해 HTTP 요청을 보낸다.
    post() 메서드는 POST 요청을 보내는 역할을 한다.
    필요에 따라 GET, PUT, DELETE 등의 요청을 보낼 수 있다.
     
  • HTTP 응답 처리: 요청 후 응답 상태 코드를 확인하여, 비정상적인 상태 코드가 반환되었을 경우 오류 메시지를 출력하도록 했다.

1.3. wait_time 설정

wait_time은 사용자가 요청을 보낸 후 일정 시간 대기하는 시간을 설정한다.
이는 사용자 간 요청이 몰리지 않도록 하며, 실제 사용자처럼 일정 간격을 두고 요청하는 시나리오를 설정하는 데 유용하다.
between(1, 5)는 1초에서 5초 사이의 랜덤한 대기 시간을 의미한다.

1.4. 환경 변수 관리

API 인증 토큰 등 민감한 데이터를 안전하게 관리하기 위해 환경 변수를 활용할 수 있다.
python-dotenv 라이브러리를 통해 .env 파일에서 환경 변수를 불러올 수 있다.

import os
from dotenv import load_dotenv

# .env 파일에서 환경 변수를 로드
load_dotenv()
access_token = os.getenv("ACCESS_TOKEN")

 

2. Locust 부하 테스트 실행

2.1. Locust 실행

테스트 스크립트를 작성한 후, 터미널에서 아래 명령어로 Locust를 실행한다.

locust

2.2. Locust 웹 UI 접속

Locust를 실행하면 웹 브라우저에서 http://localhost:8089로 접속하여 웹 기반 UI를 통해 부하 테스트를 관리할 수 있다. UI에서 동시 사용자 수와 부하 생성 속도를 설정하고, 실시간으로 테스트 진행 상황을 모니터링할 수 있다.

 

3. 테스트 결과 분석

이번 테스트는 IBM watsonx.ai의 Llama 3.1-8b 모델에 대해 200 tokens 텍스트 생성 요청을 보내면서 부하를 시뮬레이션했다.

이미지에서의 마우스 호버 부분은 사용자 수가 30명에 도달했을 때의 결과를 캡처한 것이다.

3.1. Total Requests per Second (RPS)

  • 설명: RPS는 초당 처리된 요청 수를 나타낸다. 부하가 증가할 때 서버가 얼마나 많은 요청을 처리할 수 있는지 평가하는 지표다.
  • 결과: 초기에는 RPS가 매우 낮았으나, 사용자가 증가함에 따라 RPS도 점차 상승했다.
    30명의 동시 사용자가 있었을 때 RPS는 2.5로 측정되었다.
    RPS 그래프는 사용자 수가 증가할수록 RPS도 점진적으로 증가하는 패턴을 보였으며, 이는 서버가 더 많은 동시 요청을 처리할 수 있음을 의미한다.
    테스트에서 실패한 요청은 0건으로, 모든 요청이 성공적으로 처리되었다. 이는 서버가 30명의 동시 사용자 부하를 충분히 처리할 수 있음을 보여준다.

3.2. Response Times

  • 설명: 요청에 대한 서버 응답 시간을 측정하는 지표다. Locust는 평균 응답 시간, 50번째 백분위수, 95번째 백분위수 등 다양한 응답 시간 데이터를 제공한다.
  • 결과: 사용자가 증가함에 따라 응답 시간도 함께 증가했다.
    30명의 동시 사용자가 있을 때 50번째 백분위수 응답 시간은 5100ms, 95번째 백분위수는 5500ms로 측정되었다.
    응답 시간 그래프는 처음에는 짧았지만, 사용자 수가 200명에 도달할 때까지 점진적으로 증가했다.
    이는 부하가 커짐에 따라 서버가 처리에 시간이 더 필요해졌음을 보여준다. 하지만 여전히 안정적으로 응답을 제공했다.

3.3. Number of Users

  • 설명: 동시 사용자의 수는 부하 테스트 중 시뮬레이션된 사용자 수를 의미한다. Locust는 실시간으로 사용자가 증가하는 과정을 추적할 수 있다.
  • 결과: 동시 사용자 수는 1명에서 시작해 최종적으로 200명까지 증가했다.

 

4. 결과 요약

테스트 결과, 30명의 동시 사용자가 IBM watsonx.ai API에 요청을 보냈을 때 초당 2.5개의 요청(RPS)이 처리되었으며, 응답 시간은 5100ms(50번째 백분위수)에서 5500ms(95번째 백분위수) 사이로 측정되었다. 이는 사용자 수가 증가함에 따라 응답 시간도 함께 증가했지만, 모든 요청이 성공적으로 처리되었음을 보여준다.

 

5. 결론

Locust는 IBM watsonx.ai와 같은 대규모 언어 모델 플랫폼 서버를 평가하기에 매우 적합한 도구다.
부하 테스트를 통해 동시성 처리 능력을 평가하고, 서버의 성능 병목 현상을 파악할 수 있다.
Locust의 스크립트 작성은 간단하며, 웹 UI를 통해 실시간 성능 모니터링을 지원해 사용자 경험을 크게 개선할 수 있다.
이번 테스트를 통해 IBM watsonx.ai의 성능을 평가할 수 있었으며, 향후 더 많은 사용자를 대상으로 추가적인 성능 테스트를 진행할 계획이다.