-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Add OpenVINO backend #15307
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
wine99
wants to merge
161
commits into
ggml-org:master
Choose a base branch
from
ravi9:dev_backend_openvino
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+5,750
−34
Open
Add OpenVINO backend #15307
Changes from 159 commits
Commits
Show all changes
161 commits
Select commit
Hold shift + click to select a range
675085b
Add ggml-openvino base files
YangleiZouIntel 5b28b4f
add openvino as optional backend for Llama.cpp ggml
zhanmyz 8a54dfd
* Configure the device(default CPU) that uses OpenVINO to compile th…
zhanmyz 0fc7124
Solve the issue of abnormal model output caused by using OpenVINO ADD…
zhanmyz 15b6a4f
Add OpenVINO MUL operator to GGML of Llama.cpp.
zhanmyz f246d24
Add compile options
zhanmyz f7189b5
add OpenVINO frontend convert process steps
zhanmyz d2a306f
add get openvino available ops function
zhanmyz 746bd53
Add PoC of integration of openvino frontend. Main changes: ggml-ov-fr…
yumengbo 047a771
Implement GgmlOvDecoder. Add dump functions.
yumengbo 21aaa5f
Convert subgraph with add, sub, mul, div op to ov model and do infer …
yumengbo d3f5b62
Add GGML_OV_FRONTEND option. Add readme.
yumengbo eedde64
Change output for infer request to set output tensor. Support scale, …
yumengbo 6ee5ee4
add GET_ROWS operator of OpenVINO to GGML of llama.cpp
zhanmyz 0515ab8
Update build.md and add operation mapping(GGML to OpenVINO)
zhanmyz 63327ea
add the rms_norm operator implemented using OpenVINO to the GGML back…
zhanmyz 8037eb3
Fix issue for output memory copy of infer request
yumengbo b111e6a
Change to implementation following pytorch frontend
yumengbo 4b91d1f
Add support for UNARY SILU op . Fix pytorch impl bugs.
yumengbo 923166f
Support Softmax op
yumengbo f783c2a
Support Softmax op
yumengbo aedb88a
Support ROPE op.
yumengbo 67d51bd
Add support for RMS_NORM OP
zhanmyz 33cf85f
Add MUL_MAT,CPY,CONT as operators implemented in OpenVINO for GGML ba…
zhanmyz cba097b
Move CPY from GGML OV Backend to OV Frontend
zhanmyz 9b74f0f
add implementation of MUL_MAT, CPY, CONT of GGML ops using OV ops
zhanmyz 68d53bb
add implementation of CPY when the output tensor is non-contiguous
zhanmyz 1dc4ec6
add tmp source code files
zhanmyz d941a56
Execute singel CONT operator is OK
zhanmyz f670c64
Execute CONT & VIEW operators in OV Frontend is OK
zhanmyz 1fa50c9
OV Frontend supports GET_ROWS/RMS_NORM/MUL/MUL_MAT graph conversion o…
zhanmyz 5c3face
OV Frontend supports GET_ROWS/RMS_NORM/MUL/MUL_MAT/ROPE/SCALE/SOFTMAX…
zhanmyz e986929
Change the input parameter shape of CONT operator
zhanmyz b4aad38
Change the input and ouput node shape of MUL_MAT operator
zhanmyz 0b716bb
Change the input and ouput node shape of MUL_MAT operator
zhanmyz ba490a6
change CONT and MULMAT input node shape
zhanmyz 55ddb14
All adjacent ops can conversion but calculation result is wrong and n…
zhanmyz 7c49c79
1. All operators implemented using OpenVINO can be successfully execu…
zhanmyz 7eb288b
1. Update the implementation of CPY node when it's non-contiguous
zhanmyz 137096b
Minor Update
zhanmyz d42f931
Try to add VIEW node to OV Frontend and have some issues that need to…
zhanmyz f50d073
1. In the Prompt process and predict first token stage, the PERMUTE n…
zhanmyz 53dd566
add debug info
zhanmyz f951dae
Process Prompt and predict first token is OK
zhanmyz a2f9006
1. Solve the AC issue of Permute+VIEW and MULMAL issue in the phase o…
zhanmyz 1d61ab0
1. Delete some comments
zhanmyz 987d9ee
* Use find_package in CMake to configure OpenVINO
wine99 c2768e2
change op mappings to list in openvino_supports_op
wine99 0e9e6f0
2nd+ token correct by fix CPY in OV, remove single op backend compute…
wine99 2486762
Arbitrary token len (>32) work; Fix bug in mulmat
wine99 089e253
FEAT: do PERMUTE eagerly
wine99 2fd34a6
FEAT: Add interleaved mode for ROPE
wine99 debb3dc
REFACTOR: support weigts as constant
wine99 3fcb8e2
STYLE: minor refactor
wine99 33a2c08
PERF: share const nodes for weights for diff infer
wine99 d63506e
BUILD: update build doc, add cmake preset, add CACHE_DIR env var
wine99 78f63af
FEAT: improve debug capability
wine99 12b5c86
PERF: compile once (dynamic graph + cache)
wine99 d38e14a
Rebase - Bring up to date and fix build process
virajwad 3c07b5a
fix build error
wine99 3efe972
FIX: backend buffer type issue
wine99 985510a
STYLE: clang-format
wine99 c18d1d3
FEAT: Add all conversion code from ov side
wine99 bbe9024
PERF: favor low precision matmul
wine99 3a2ce74
STYLE and minor REFACTOR
wine99 7335069
FIX: Re-add tensor names in cgraph, Add another case for RESHAPE
wine99 94b25eb
FIX: input shape of KQ_mask
wine99 17fdbee
PERF: add weight constant in parallel
wine99 9219181
FIX: set_max_token_len
wine99 fa4e63a
PERF: use Slice+Concat in writing cache_v
wine99 9bd970d
Update build doc
wine99 0f5cca4
Add cgraph tensor output name to OV op name
wine99 59ca4b5
Update openvino build instructions
ravi9 5abccbe
Add initial NPU support
wine99 f7f13b6
draft NPU support version 2: prefill + kvcache
wine99 9256f60
NPU support version 2: prefill + kvcache
wine99 4968ddb
Change due to ggml cgraph changes, not correct yet
wine99 f4ead6d
Change due to ggml cgraph changes, llama-3.2 CPU work
wine99 b498444
Add AMD64 to CMakeLists
wine99 477c289
Change due to ggml cgraph changes, all device work
wine99 36acacd
Refactor: clean, fix warning
wine99 f0e732b
Update clang-format
wine99 85a10a1
Statful transformation for CPU GPU
wine99 44e9dcc
Add SwiGLU
wine99 bc12dc1
Fuse to SDPA
wine99 35249d0
Replace Concat with Broadcast in MulMat for GQA
wine99 5a78d7f
Pull out indices creation for kv cache update
wine99 0c6bae4
Refactor: remove past_token_len from extra_inputs
wine99 91b3c15
Fix Phi3 SwiGLU and SoftMax
wine99 94ca8fd
Pull out sin cos from rope
wine99 5a95352
Reduce memory: free ov weights node after graph conversion
wine99 a15fe5f
Fix CPY due to cgraph change
wine99 b1ccdd9
Added OpenVINO CI/CD. Updated docs
ravi9 62695f0
Fix llama-cli
wine99 7c309ae
Fix Phi3 ROPE; Add test-backend-ops
wine99 5b37307
Fix NPU
wine99 9536b84
Fix llama-bench; Clang-format
wine99 c3c2960
Fix llama-perplexity
wine99 0a207ec
temp. changes for mark decomp
cavusmustafa 8b1bf53
matmul in fp32
wine99 8ed93e9
mulmat input conversion fix
cavusmustafa 06213b1
mulmat type conversion update
cavusmustafa a7bc9dd
add mark decomp pass
cavusmustafa 3b1639f
Revert changes in fuse_to_sdpa
wine99 338fd25
Update build.md
ravi9 6a1b424
Fix test-backend-ops
wine99 9351310
Skip test-thread-safety; Run ctest only in ci/run.sh
wine99 57e92d2
Use CiD for NPU
wine99 ec8571e
Optimize tensor conversion, improve TTFT
wine99 01f0a3e
Support op SET_ROWS
wine99 bcb173c
Fix NPU
wine99 179d68f
Remove CPY
wine99 ebc5c33
Fix test-backend-ops
wine99 b26f6bb
Minor updates for raising PR
wine99 9d6526f
Perf: RMS fused to OV internal RMS op
wine99 0136338
Fix after rebasing
wine99 48c5cc5
Change openvino device_type to GPU; Enable flash_attn
wine99 43c852a
Update supports_buft and supports_op for quantized models
wine99 db049d0
Add quant weight conversion functions from genai gguf reader
wine99 0caad15
Quant models run with accuracy issue
wine99 970eca1
Fix accuracy: disable cpu_repack
wine99 7186a8b
Fix CI; Disable test-backend-ops
wine99 5ace942
Fix Q4_1
wine99 5029367
Fix test-thread-safety
wine99 a262e21
Fix test-backend-ops: Treat quantized tensors as weights
wine99 dea1d2a
Add NPU Q4_0 support
wine99 11e289c
NPU perf: eliminate zp
wine99 7b64a16
Dequantize q4_1 q4_k q6_k for NPU
wine99 ffca963
Add custom quant type: q8_1_c, q4_0_128
wine99 9459bc5
Set m_is_static=false as default in decoder
wine99 ad296b7
Simpilfy translation of get_rows
wine99 d9333b1
Fix after rebasing
wine99 32206c4
Improve debug util; Eliminate nop ReshapeReshape
wine99 9db6bb4
STYLE: make get_types_to_requant a function
wine99 f8e9be7
Support BF16 model
wine99 fe383f3
Fix NPU compile
wine99 5732262
WA for npu 1st token acc issue
wine99 077f9fc
Apply EliminateZP only for npu
wine99 60ec76b
Add GeGLU
wine99 d942ac2
Fix Hunyuan
wine99 228a742
Support iSWA
wine99 77da485
Fix NPU accuracy
wine99 5938048
Fix ROPE accuracy when freq_scale != 1
wine99 a655aad
Minor: not add attention_size_swa for non-swa model
wine99 21614a1
Minor refactor
wine99 96254f9
Add Q5_K to support phi-3-q4_k_m
wine99 f785c3d
Requantize Q6_K (gs16) to gs32 on GPU
wine99 e6dca1b
Fix after rebasing
wine99 2413170
Always apply Eliminate_ZP to fix GPU compile issue on some platforms
wine99 e444b88
kvcachefusion support
cavusmustafa c40b9fe
env variable GGML_OPENVINO_DISABLE_SDPA_OPTIMIZATION added
cavusmustafa c21d664
Fix for Phi3
cavusmustafa 3370915
Fix llama-cli (need to run with --no-warmup)
wine99 47843b6
Fix add_sliced_mask; Revert mulmat, softmax; Remove input attention_s…
wine99 63f6bba
fix after rebasing
wine99 b41f494
Fix llama-3-8b and phi3-mini q4_0 NPU
wine99 d4eb8ec
Update to OV-2025.3 and CMakeLists.txt
ravi9 f89292d
Add OV CI cache
wine99 89b8212
Apply CISC review and update CI to OV2025.3
ravi9 09ead55
Update CI to run OV dep install before build
ravi9 7d8ea73
Update OV dockerfile to use OV2025.3 and update build docs
ravi9 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,134 @@ | ||
ARG OPENVINO_VERSION_MAJOR=2025.2 | ||
ARG OPENVINO_VERSION_FULL=2025.2.0.19140.c01cd93e24d | ||
ARG UBUNTU_VERSION=24.04 | ||
|
||
# Optional proxy build arguments - empty by default | ||
ARG http_proxy= | ||
ARG https_proxy= | ||
|
||
## Build Image | ||
FROM ubuntu:${UBUNTU_VERSION} AS build | ||
|
||
# Pass proxy args to build stage | ||
ARG http_proxy | ||
ARG https_proxy | ||
|
||
RUN apt-get update && \ | ||
apt-get install -y --no-install-recommends \ | ||
ca-certificates \ | ||
gnupg \ | ||
wget \ | ||
git \ | ||
cmake \ | ||
ninja-build \ | ||
build-essential \ | ||
libtbb12 \ | ||
libcurl4-openssl-dev && \ | ||
rm -rf /var/lib/apt/lists/* | ||
|
||
# Install OpenVINO for Ubuntu 24.04 | ||
ARG OPENVINO_VERSION_MAJOR | ||
ARG OPENVINO_VERSION_FULL | ||
RUN mkdir -p /opt/intel && \ | ||
wget https://storage.openvinotoolkit.org/repositories/openvino/packages/${OPENVINO_VERSION_MAJOR}/linux/openvino_toolkit_ubuntu24_${OPENVINO_VERSION_FULL}_x86_64.tgz && \ | ||
tar -xf openvino_toolkit_ubuntu24_${OPENVINO_VERSION_FULL}_x86_64.tgz && \ | ||
mv openvino_toolkit_ubuntu24_${OPENVINO_VERSION_FULL}_x86_64 /opt/intel/openvino_${OPENVINO_VERSION_MAJOR} && \ | ||
cd /opt/intel/openvino_${OPENVINO_VERSION_MAJOR} && \ | ||
echo "Y" | ./install_dependencies/install_openvino_dependencies.sh && \ | ||
cd - && \ | ||
ln -s /opt/intel/openvino_${OPENVINO_VERSION_MAJOR} /opt/intel/openvino | ||
|
||
ENV OpenVINO_DIR=/opt/intel/openvino | ||
|
||
WORKDIR /app | ||
|
||
COPY . . | ||
|
||
# Build Stage | ||
RUN bash -c "source ${OpenVINO_DIR}/setupvars.sh && \ | ||
cmake -B build/ReleaseOV -G Ninja \ | ||
-DCMAKE_BUILD_TYPE=Release \ | ||
-DGGML_OPENVINO=ON && \ | ||
cmake --build build/ReleaseOV -j$(nproc)" | ||
|
||
# Copy all necessary libraries | ||
RUN mkdir -p /app/lib && \ | ||
find build/ReleaseOV -name '*.so*' -exec cp {} /app/lib \; && \ | ||
find ${OpenVINO_DIR}/runtime/lib/intel64 -name '*.so*' -exec cp -P {} /app/lib \; 2>/dev/null || \ | ||
find ${OpenVINO_DIR}/lib/intel64 -name '*.so*' -exec cp -P {} /app/lib \; | ||
|
||
# Create runtime directories and copy binaries | ||
RUN mkdir -p /app/full \ | ||
&& cp build/ReleaseOV/bin/* /app/full/ \ | ||
&& cp *.py /app/full \ | ||
&& cp -r gguf-py /app/full \ | ||
&& cp -r requirements /app/full \ | ||
&& cp requirements.txt /app/full \ | ||
&& cp .devops/tools.sh /app/full/tools.sh | ||
|
||
## Base Runtime Image | ||
FROM ubuntu:${UBUNTU_VERSION} AS base | ||
|
||
# Pass proxy args to runtime stage | ||
ARG http_proxy | ||
ARG https_proxy | ||
|
||
RUN apt-get update \ | ||
&& apt-get install -y libgomp1 libtbb12 curl\ | ||
&& apt autoremove -y \ | ||
&& apt clean -y \ | ||
&& rm -rf /tmp/* /var/tmp/* \ | ||
&& find /var/cache/apt/archives /var/lib/apt/lists -not -name lock -type f -delete \ | ||
&& find /var/cache -type f -delete | ||
|
||
COPY --from=build /app/lib/ /app/ | ||
|
||
### Full (all binaries) | ||
FROM base AS full | ||
|
||
ARG http_proxy | ||
ARG https_proxy | ||
|
||
COPY --from=build /app/full /app/ | ||
|
||
WORKDIR /app | ||
|
||
RUN apt-get update && \ | ||
apt-get install -y --no-install-recommends \ | ||
git \ | ||
python3 \ | ||
python3-venv \ | ||
python3-pip && \ | ||
python3 -m venv /ov-venv && \ | ||
/ov-venv/bin/pip install --no-cache-dir --upgrade pip setuptools wheel && \ | ||
/ov-venv/bin/pip install --no-cache-dir -r requirements.txt && \ | ||
apt-get autoremove -y && \ | ||
apt-get clean && \ | ||
rm -rf /tmp/* /var/tmp/* && \ | ||
find /var/cache/apt/archives /var/lib/apt/lists -not -name lock -type f -delete && \ | ||
find /var/cache -type f -delete | ||
|
||
ENTRYPOINT ["/bin/bash", "-c", "source /ov-venv/bin/activate && exec /app/tools.sh \"$@\"", "--"] | ||
|
||
|
||
### Light, CLI only | ||
FROM base AS light | ||
|
||
COPY --from=build /app/full/llama-cli /app/ | ||
|
||
WORKDIR /app | ||
|
||
ENTRYPOINT [ "/app/llama-cli" ] | ||
|
||
### Server, Server only | ||
FROM base AS server | ||
|
||
ENV LLAMA_ARG_HOST=0.0.0.0 | ||
|
||
COPY --from=build /app/full/llama-server /app/ | ||
|
||
WORKDIR /app | ||
|
||
HEALTHCHECK CMD [ "curl", "-f", "http://localhost:8080/health" ] | ||
|
||
ENTRYPOINT [ "/app/llama-server" ] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
name: "Linux - Setup OpenVINO Toolkit" | ||
description: "Setup OpenVINO Toolkit for Linux" | ||
inputs: | ||
path: | ||
description: "Installation path" | ||
required: true | ||
version_major: | ||
description: "OpenVINO major version (e.g., 2025.3)" | ||
required: true | ||
version_full: | ||
description: "OpenVINO full version (e.g., 2025.3.0.19807.44526285f24)" | ||
required: true | ||
|
||
runs: | ||
using: "composite" | ||
steps: | ||
- name: Setup OpenVINO Toolkit | ||
id: setup | ||
uses: ./.github/actions/unarchive-tar | ||
with: | ||
url: https://storage.openvinotoolkit.org/repositories/openvino/packages/${{ inputs.version_major }}/linux/openvino_toolkit_ubuntu24_${{ inputs.version_full }}_x86_64.tgz | ||
path: ${{ inputs.path }} | ||
type: z | ||
strip: 1 | ||
|
||
- name: Install OpenVINO dependencies | ||
shell: bash | ||
run: | | ||
cd ${{ inputs.path }} | ||
echo "Y" | sudo -E ./install_dependencies/install_openvino_dependencies.sh | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -700,6 +700,55 @@ jobs: | |
-DGGML_SYCL_F16=ON | ||
cmake --build build --config Release -j $(nproc) | ||
|
||
ubuntu-24-cmake-openvino: | ||
runs-on: ubuntu-24.04 | ||
|
||
env: | ||
# Make sure this is in sync with build-cache.yml | ||
OPENVINO_VERSION_MAJOR: "2025.3" | ||
OPENVINO_VERSION_FULL: "2025.3.0.19807.44526285f24" | ||
|
||
steps: | ||
- name: Clone | ||
id: checkout | ||
uses: actions/checkout@v4 | ||
|
||
- name: ccache | ||
uses: ggml-org/[email protected] | ||
with: | ||
key: ubuntu-24-cmake-openvino-no-preset-v1 | ||
evict-old-files: 1d | ||
|
||
- name: Dependencies | ||
id: depends | ||
run: | | ||
sudo apt-get update | ||
sudo apt-get install -y build-essential libcurl4-openssl-dev libtbb12 cmake ninja-build python3-pip | ||
|
||
- name: Use OpenVINO Toolkit Cache | ||
uses: actions/cache@v4 | ||
id: cache-openvino | ||
with: | ||
path: ./openvino_toolkit | ||
key: openvino-toolkit-v${{ env.OPENVINO_VERSION_FULL }}-${{ runner.os }} | ||
|
||
- name: Setup OpenVINO Toolkit | ||
if: steps.cache-openvino.outputs.cache-hit != 'true' | ||
uses: ./.github/actions/linux-setup-openvino | ||
with: | ||
path: ./openvino_toolkit | ||
version_major: ${{ env.OPENVINO_VERSION_MAJOR }} | ||
version_full: ${{ env.OPENVINO_VERSION_FULL }} | ||
|
||
- name: Build | ||
id: cmake_build | ||
run: | | ||
source ./openvino_toolkit/setupvars.sh | ||
cmake -B build/ReleaseOV -G Ninja \ | ||
-DCMAKE_BUILD_TYPE=Release \ | ||
-DGGML_OPENVINO=ON | ||
cmake --build build/ReleaseOV --config Release -j $(nproc) | ||
|
||
build-linux-cross: | ||
uses: ./.github/workflows/build-linux-cross.yml | ||
|
||
|
@@ -1550,27 +1599,27 @@ jobs: | |
GG_BUILD_VULKAN=1 bash ./ci/run.sh ~/results/llama.cpp ~/mnt/llama.cpp | ||
|
||
ggml-ci-arm64-cpu-kleidiai: | ||
runs-on: ubuntu-22.04-arm | ||
|
||
steps: | ||
- name: Clone | ||
id: checkout | ||
uses: actions/checkout@v4 | ||
|
||
- name: ccache | ||
uses: ggml-org/[email protected] | ||
with: | ||
key: ggml-ci-arm64-cpu-kleidiai | ||
evict-old-files: 1d | ||
|
||
- name: Dependencies | ||
id: depends | ||
run: | | ||
sudo apt-get update | ||
sudo apt-get install -y build-essential libcurl4-openssl-dev | ||
|
||
- name: Test | ||
id: ggml-ci | ||
run: | | ||
GG_BUILD_KLEIDIAI=1 GG_BUILD_EXTRA_TESTS_0=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt | ||
runs-on: ubuntu-22.04-arm | ||
|
||
steps: | ||
- name: Clone | ||
id: checkout | ||
uses: actions/checkout@v4 | ||
|
||
- name: ccache | ||
uses: ggml-org/[email protected] | ||
with: | ||
key: ggml-ci-arm64-cpu-kleidiai | ||
evict-old-files: 1d | ||
|
||
- name: Dependencies | ||
id: depends | ||
run: | | ||
sudo apt-get update | ||
sudo apt-get install -y build-essential libcurl4-openssl-dev | ||
|
||
- name: Test | ||
id: ggml-ci | ||
run: | | ||
GG_BUILD_KLEIDIAI=1 GG_BUILD_EXTRA_TESTS_0=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt | ||
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.