[ai] Qwen2.5-72b 성능 무엇?!

@codemaru · October 17, 2024 · 18 min read

막내가 코드를 한 줄 고쳤다. 플래그가 잘못돼서 검사 루틴 체크가 안된다면서 값을 0x100에서 0x50으로 변경했다. 0x50만 보고 난 넘겨 짚었다. 쓸데 없는 걸 또 왜 고쳤지, 라는 생각.

그러다 같이 저녁을 먹게 되서 관련해서 이야기를 듣게 됐다. 자기가 분석해봤는데 기존 코드에 이러저러한 부분 때문에 플래그가 클리어돼서 고쳐야 한다는 것이었다. 다른 주장이 있어서 일단 가서 다시 살펴 보겠다고는 했다. 그러면서도 내 생각은 여전히 세모라고 했다. 0x50은 틀린 건 확실했기 때문이다. 클리어 된다는 걸 내가 체크를 못한 건가 해서 확인을 해야겠다 싶었다.

집에 와서 코드를 보니 막내 말도 맞았다. 하지만 문제는 0x50이었다. 0x10이랑 0x40을 쓰는 플래그랑 겹치는 값인 것이다. 그래서 과연 인공지능은 이 문제를 파악해낼지 궁금해서 테스트를 해보았다. 결과는 Qwen2.5-72b의 압승. 물론 사고력 모델인 o1 시리즈는 차원이 다른 답을 보여주었다. 그들 사이엔 768차원 정도의 간극이 있긴 한듯.

프롬프트

XXX 플래그 검사하는 로직으로 살펴봤을 때 아래 코드에서 EEE_INDEX를 MAKELONG(0x50, 3)로 변경하는게 문제 없는지 판단해줘

AAA_INDEX = MAKELONG(0x10, 3),
BBB_INDEX = MAKELONG(0x20, 3),
CCC_INDEX = MAKELONG(0x40, 3),
DDD_INDEX = MAKELONG(0x80, 3),
EEE_INDEX = MAKELONG(0x100, 3),

... 관련 코드 ...

4o-mini

얘는 일단 말귀 자체를 못 알아 먹는다. 0x100을 0x50으로 변경하는 걸 검토하라는데 엉뚱한 소리를 함.

EEE_INDEXMAKELONG(0x100, 3)으로 변경하는 것이 문제가 없는지 판단하기 위해 몇 가지 요소를 고려해야 합니다.

1. 상수 중복 여부

EEE_INDEXMAKELONG(0x100, 3)으로 설정될 경우, 다른 인덱스 값과의 중복 여부를 확인해야 합니다. 주어진 코드에서 다른 인덱스 > 값들은 다음과 같습니다:

  • AAA_INDEX = MAKELONG(0x10, 3)
  • BBB_INDEX = MAKELONG(0x20, 3)
  • CCC_INDEX = MAKELONG(0x40, 3)
  • DDD_INDEX = MAKELONG(0x80, 3)

MAKELONG(0x100, 3)는 이들과 중복되지 않으며, 기존의 값들과 겹치지 않기 때문에 문제는 없습니다.

2. 논리적 의미

EEE_INDEX의 의미를 파악하는 것이 중요합니다. ...

3. 사용된 위치

코드에서 EEE_INDEX가 어떻게 사용되는지를 검토해야 합니다. Do 메서드와 같은 곳에서 해당 플래그가 어떤 동작을 유발하는지 > 이해해야 합니다. 만약 EEE_INDEXGetFileEx 또는 TestFlag와 같은 중요한 검사와 연관되어 있다면, 변경으로 인해 예상치 못한 동작이 발생할 수 있습니다.

결론

위의 분석을 바탕으로, EEE_INDEXMAKELONG(0x100, 3)로 변경하는 것이 중복이나 충돌 없이 문제가 없을 것으로 보입니다. 그러나 해당 플래그가 어떤 의미를 지니고 있는지, 그리고 그 사용 위치를 검토하여 최종 판단을 내리는 것이 좋습니다. 특히, 기존의 로직이 이 값을 기반으로 동작하고 있다면, 변경이 다른 동작에 영향을 미칠 수 있으므로 신중해야 합니다.

4o

얘는 말귀는 알아 먹었고 전개도 나쁘진 않았지만 결국 장황하게 설명하며 핵심을 피해가고 있다. 아는 거 같기도 하고 모르는 거 같기도 하고 뭔가 모르지만 아는 척 하는 거 같기도 한 아주 두루뭉실 애매한 답변.

주어진 코드에서는 다양한 이벤트 또는 조건 플래그를 설정하기 위해 MAKELONG 매크로를 사용합니다. MAKELONG는 두 개의 16비트 값을 받아 하나의 32비트 값을 생성하는 매크로로, 여기서는 인덱스를 생성하는 데 사용되고 있습니다.

EEE_INDEX를 MAKELONG(0x100, 3)에서 MAKELONG(0x50, 3)으로 변경하려는 제안에 대해 검사해 보도록 하겠습니다.

MAKELONG의 구조: MAKELONG(a, b) 구조에서 a는 하위 16비트 값을, b는 상위 16비트 값을 나타냅니다. 즉, MAKELONG(0x100, 3)은 0x00030064이라는 32비트 수를 생성하며, 이는 플래그 배열의 3번째 부분(HIWORD)에 0x100 비트를 설정하고자 할 때 사용됩니다.

변경 시나리오:

MAKELONG(0x50, 3)은 0x00030050이라는 값을 생성하게 됩니다. 이는 플래그 배열의 동일한 3번째 부분(HIWORD)에서 0x50 비트를 설정합니다.
이 변경은 bit 부분만을 변경하므로, 인덱스의 비트 위치가 달라지게 되어 플래그가 검사될 때 다른 조건으로 해석될 수 있습니다.

문제점:

기존에 정의된 다른 플래그와의 중복이나, 애플리케이션의 로직 흐름에서 이 플래그의 역할이 달라질 가능성을 고려해야 합니다.
다른 부분의 코드(예: TestFlag 및 파일 처리 로직)에서 이 플래그의 새로운 상태를 관리하는 방법이 제대로 처리되는지 확인해야 합니다.

리스크 평가:

만약 다른 플래그들과의 중복이 없다면, 변경은 문제를 일으키지 않지만, 코드 베이스 전체를 고려했을 때 이 변경이 코드의 다른 부분과 호환되는지 충분히 검토해야 합니다.
결론적으로, EEE_INDEX 값을 0x50으로 변경하는 것은 인덱스 값의 비트 위치를 변경하는 것이므로, 이런 변경이 시스템 내 다른 곳에 영향을 미치지 않는지를 충분히 검토한 후에 수행해야 합니다. 구체적으로는 기존 로직에서 어떻게 이 플래그를 사용하는지 전반적인 코드 흐름에 대한 검토가 있을 때 비로소 안전하다고 판단할 수 있습니다.

참고 문서
C++ MAKELONG 매크로 사용법
비트 연산을 통한 플래그 관리 방법
코드 내 TestFlag와 유사 함수의 플래그 처리를 위한 예제 코드

Qwen2.5-72b

놀랐다. 문제점을 정확하게 찾았다. 기존 플래그과 중첩된다는 걸 체크한다. 하지만 실수도 나랑 똑같았다.

새로운 플래그를 추가할 때는 이미 사용 중인 플래그와 충돌하지 않는 값으로 설정해야 합니다. 예를 들어, MAKELONG(0x200, 3)과 같은 값으로 변경하는 것이 안전할 것입니다.

이 부분이 옥의 티. 나도 별 생각 없이 예전에 만든 코드라 0x100을 추가했는데 한바이트라 비트를 8개 밖에 쓰지를 못한다. 그래서 제대로 수정하려면 MAKELONG(1, 4)가 돼야 한다. 그럼에도 얘는 정확하게 막내의 수정 사항의 문제점을 찾아냈다는데 대해서는 몹시 칭찬한다. 알리바바가 외계인을 갈아 넣고 있는 건 정말 진실인지도?!

양자화가 모델에 미치는 영향을 살펴보기 위해서 추가로 테스트를 더 돌려 보았는데 문제 답을 맞추기 위해서는 8비트 이상이 필요했다. 8비트 아래로 내려가면 4o와 비슷한 수준의 답변만 내놓는다.

주어진 코드에서 EEE_INDEX를 MAKELONG(0x100, 3)에서 MAKELONG(0x50, 3)으로 변경하는 것이 문제 없는지 판단하기 위해서는 몇 가지 점을 고려해야 합니다.

비트 충돌: MAKELONG(0x50, 3)은 0x50을 3번 째 부분에 설정하는 것을 의미합니다. 이 값이 이미 사용 중인 다른 플래그와 충돌하지 않는지 확인해야 합니다. 현재 코드에서 이미 사용 중인 플래그들은 다음과 같습니다:

AAA_INDEX = MAKELONG(0x10, 3)
BBB_INDEX = MAKELONG(0x20, 3)
CCC_INDEX = MAKELONG(0x40, 3)
DDD_INDEX = MAKELONG(0x80, 3)
0x50은 0x40과 0x10의 조합으로, CCC_INDEX와 AAA_INDEX와 충돌할 수 있습니다. 따라서 EEE_INDEX를 MAKELONG(0x50, 3)으로 변경하면 이 두 플래그와의 충돌이 발생할 수 있습니다.

플래그 관리: 플래그는 비트 마스크로 관리되므로, 각 플래그가 독립적으로 설정되고 해제될 수 있어야 합니다. 0x50은 0x40과 0x10의 조합이므로, EEE_INDEX를 설정하거나 해제할 때 AAA_INDEX와 CCC_INDEX도 함께 영향을 받게 됩니다. 이는 원하지 않는 동작을 초래할 수 있습니다.

코드의 안정성: 플래그 값이 충돌하면 코드의 안정성과 예측 가능성이 떨어집니다. 따라서 새로운 플래그를 추가할 때는 이미 사용 중인 플래그와의 충돌을 피하는 것이 중요합니다.

결론
EEE_INDEX를 MAKELONG(0x50, 3)으로 변경하는 것은 이미 사용 중인 AAA_INDEX와 CCC_INDEX와의 충돌을 일으킬 수 있으므로, 이 변경은 권장되지 않습니다. 대신, 새로운 플래그를 추가할 때는 이미 사용 중인 플래그와 충돌하지 않는 값으로 설정해야 합니다. 예를 들어, MAKELONG(0x200, 3)과 같은 값으로 변경하는 것이 안전할 것입니다.

참고 문서
주어진 코드 스니펫
비트 마스크와 플래그 관리에 대한 일반적인 지식

o1-mini

사고력은 역시 미니라도 o1인가. o1-preview 는 굳이 등판할 이유조차 없는 답변. 한수 위가 뭔지 철저하게 보여준다. 참고로 5초 생각했다 ㅋㅋㅋ~

변수 EEE_INDEXMAKELONG(0x100, 3)에서 MAKELONG(0x50, 3)으로 변경하려는 의도는 이해됩니다. 그러나 이 변경이 문제를 일으킬 가능성이 높습니다. 아래에서 그 이유를 상세히 설명드리겠습니다.

현재 플래그 정의

현재 플래그는 다음과 같이 정의되어 있습니다:

AAA_INDEX = MAKELONG(0x10, 3),
BBB_INDEX = MAKELONG(0x20, 3),
CCC_INDEX = MAKELONG(0x40, 3),
DDD_INDEX = MAKELONG(0x80, 3),
EEE_INDEX = MAKELONG(0x100, 3),

MAKELONG의 동작

MAKELONG 매크로는 두 개의 16비트 값을 받아 32비트 값을 생성합니다. 여기서 첫 번째 인자는 LOWORD, 두 번째 인자는 HIWORD로 설정됩니다. 예를 들어:

  • MAKELONG(0x10, 3)HIWORD = 3, LOWORD = 0x10이 됩니다.
  • MAKELONG(0x100, 3)MAKELONG(0x50, 3)으로 변경하면 LOWORD0x50으로 변경됩니다.

변경 시 발생할 수 있는 문제

  1. 비트 중복:
    • 0x50은 16진수로 0101 0000 (2진수)입니다.
    • 이는 0x10 (0001 0000)과 0x40 (0100 0000)의 비트가 모두 설정된 상태입니다.
    • 현재 다른 플래그들이 0x100x40을 개별적으로 사용하고 있기 때문에, 0x50으로 설정하면 두 플래그가 동시에 활성화된 것으로 인식될 수 있습니다.
  2. 플래그 충돌:
    • EEE_INDEX0x50으로 변경하면, 다른 플래그들과 비트가 겹치게 되어 의도치 않게 여러 플래그가 동시에 활성화되거나 해제될 수 있습니다.
    • 이는 플래그 검사 로직에서 혼란을 초래할 수 있으며, 예상치 못한 동작을 유발할 수 있습니다.
  3. 플래그 관리의 복잡성 증가:
    • 단일 비트 플래그를 복합 비트로 변경하면, 플래그를 설정하거나 해제할 때 복잡성이 증가합니다.
    • 예를 들어, 0x50을 설정할 때 0x100x40을 모두 설정해야 하며, 이를 해제할 때도 동일하게 처리해야 합니다.

권장 사항

  • 고유한 비트 사용: 각 플래그는 고유한 비트를 사용하는 것이 좋습니다. 이는 플래그 간의 충돌을 방지하고, 플래그 관리의 명확성을 유지하는 데 도움이 됩니다.

    예를 들어, EEE_INDEX0x200 (MAKELONG(0x200, 3))과 같이 고유한 비트를 할당하는 것을 고려해보세요.

  • 플래그 정의 재검토: 만약 0x50을 사용해야 하는 특별한 이유가 있다면, 해당 플래그가 기존 플래그들과 어떻게 상호작용하는지, 그리고 이를 처리하기 위한 추가 로직이 필요한지 신중하게 검토해야 합니다.

  • 코드 리뷰 및 테스트: 변경 사항을 적용하기 전에 코드 전체에 걸쳐 플래그가 어떻게 사용되고 있는지 철저히 리뷰하고, 충분한 테스트를 통해 예상치 못한 부작용이 없는지 확인해야 합니다.

결론

EEE_INDEXMAKELONG(0x50, 3)으로 변경하는 것은 현재 플래그 정의와 사용 방식을 고려할 때 권장되지 않습니다. 이는 플래그 간의 비트 충돌을 유발하여 시스템 동작에 예기치 않은 문제를 초래할 수 있습니다. 고유한 비트를 유지하는 방향으로 변경을 고려하시기 바랍니다.

추가적인 질문이나 코드 관련 상세한 검토가 필요하시다면 언제든지 문의해주세요!

총평

기존 챗본 경쟁에서 OpenAI의 해자는 점점 없어지는 것으로 보여진다. o1 모델이 나오지 않았다면 정말 참담하지 않았을까 싶다. o1 모델이 있긴 하지만 앞으로도 경쟁 우위를 유지하기란 쉽지 않을 것 같다는 생각. 최근 mmlu-pro 리더보드에 grok2가 4o 위에 0.7546으로 등재됐다. 물론 셀프 리포팅이긴 하지만 구라는 아닐 거 같다는 느낌. 이런걸 보면 System 1 사고를 한다는 앵무새 챗봇 경쟁은 gpu 살만한 돈들이 있는 회사들은 대부분 상향 평준화가 된 게 아닌가 싶다.

알리바바에 거액을 날려 먹었지만 공산당만 아니면 다시 투자할 의향이 생기는 QWen2.5 72b였다. 그럼에도 진정 이바닥 위너는 nvidia인가?!

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중