forked from ggerganov/llama.cpp
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
681ae74
commit 5d5992d
Showing
2 changed files
with
362 additions
and
0 deletions.
There are no files selected for viewing
This file contains 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,164 @@ | ||
--- | ||
Language: Cpp | ||
# BasedOnStyle: Google | ||
AccessModifierOffset: -1 | ||
AlignAfterOpenBracket: Align | ||
AlignConsecutiveMacros: false | ||
AlignConsecutiveAssignments: false | ||
AlignConsecutiveDeclarations: false | ||
AlignEscapedNewlines: Left | ||
AlignOperands: true | ||
AlignTrailingComments: true | ||
AllowAllArgumentsOnNextLine: true | ||
AllowAllConstructorInitializersOnNextLine: true | ||
AllowAllParametersOfDeclarationOnNextLine: true | ||
AllowShortBlocksOnASingleLine: Never | ||
AllowShortCaseLabelsOnASingleLine: false | ||
AllowShortFunctionsOnASingleLine: All | ||
AllowShortLambdasOnASingleLine: All | ||
AllowShortIfStatementsOnASingleLine: WithoutElse | ||
AllowShortLoopsOnASingleLine: true | ||
AlwaysBreakAfterDefinitionReturnType: None | ||
AlwaysBreakAfterReturnType: None | ||
AlwaysBreakBeforeMultilineStrings: true | ||
AlwaysBreakTemplateDeclarations: Yes | ||
BinPackArguments: true | ||
BinPackParameters: true | ||
BraceWrapping: | ||
AfterCaseLabel: false | ||
AfterClass: false | ||
AfterControlStatement: false | ||
AfterEnum: false | ||
AfterFunction: false | ||
AfterNamespace: false | ||
AfterObjCDeclaration: false | ||
AfterStruct: false | ||
AfterUnion: false | ||
AfterExternBlock: false | ||
BeforeCatch: false | ||
BeforeElse: false | ||
IndentBraces: false | ||
SplitEmptyFunction: true | ||
SplitEmptyRecord: true | ||
SplitEmptyNamespace: true | ||
BreakBeforeBinaryOperators: None | ||
BreakBeforeBraces: Attach | ||
BreakBeforeInheritanceComma: false | ||
BreakInheritanceList: BeforeColon | ||
BreakBeforeTernaryOperators: true | ||
BreakConstructorInitializersBeforeComma: false | ||
BreakConstructorInitializers: BeforeColon | ||
BreakAfterJavaFieldAnnotations: false | ||
BreakStringLiterals: true | ||
ConstructorInitializerAllOnOneLineOrOnePerLine: true | ||
ConstructorInitializerIndentWidth: 4 | ||
ContinuationIndentWidth: 4 | ||
Cpp11BracedListStyle: true | ||
DeriveLineEnding: true | ||
DerivePointerAlignment: true | ||
DisableFormat: false | ||
ExperimentalAutoDetectBinPacking: false | ||
FixNamespaceComments: true | ||
ForEachMacros: | ||
- foreach | ||
- Q_FOREACH | ||
- BOOST_FOREACH | ||
IncludeBlocks: Regroup | ||
IncludeCategories: | ||
- Regex: '^<ext/.*\.h>' | ||
Priority: 2 | ||
SortPriority: 0 | ||
- Regex: '^<.*\.h>' | ||
Priority: 1 | ||
SortPriority: 0 | ||
- Regex: '^<.*' | ||
Priority: 2 | ||
SortPriority: 0 | ||
- Regex: '.*' | ||
Priority: 3 | ||
SortPriority: 0 | ||
IncludeIsMainRegex: '([-_](test|unittest))?$' | ||
IncludeIsMainSourceRegex: '' | ||
IndentCaseLabels: true | ||
IndentGotoLabels: true | ||
IndentPPDirectives: None | ||
IndentWidth: 4 | ||
IndentWrappedFunctionNames: false | ||
JavaScriptQuotes: Leave | ||
JavaScriptWrapImports: true | ||
KeepEmptyLinesAtTheStartOfBlocks: false | ||
MacroBlockBegin: '' | ||
MacroBlockEnd: '' | ||
MaxEmptyLinesToKeep: 1 | ||
NamespaceIndentation: None | ||
ObjCBinPackProtocolList: Never | ||
ObjCBlockIndentWidth: 2 | ||
ObjCSpaceAfterProperty: false | ||
ObjCSpaceBeforeProtocolList: true | ||
PenaltyBreakAssignment: 2 | ||
PenaltyBreakBeforeFirstCallParameter: 1 | ||
PenaltyBreakComment: 300 | ||
PenaltyBreakFirstLessLess: 120 | ||
PenaltyBreakString: 1000 | ||
PenaltyBreakTemplateDeclaration: 10 | ||
PenaltyExcessCharacter: 1000000 | ||
PenaltyReturnTypeOnItsOwnLine: 200 | ||
PointerAlignment: Left | ||
RawStringFormats: | ||
- Language: Cpp | ||
Delimiters: | ||
- cc | ||
- CC | ||
- cpp | ||
- Cpp | ||
- CPP | ||
- 'c++' | ||
- 'C++' | ||
CanonicalDelimiter: '' | ||
BasedOnStyle: google | ||
- Language: TextProto | ||
Delimiters: | ||
- pb | ||
- PB | ||
- proto | ||
- PROTO | ||
EnclosingFunctions: | ||
- EqualsProto | ||
- EquivToProto | ||
- PARSE_PARTIAL_TEXT_PROTO | ||
- PARSE_TEST_PROTO | ||
- PARSE_TEXT_PROTO | ||
- ParseTextOrDie | ||
- ParseTextProtoOrDie | ||
CanonicalDelimiter: '' | ||
BasedOnStyle: google | ||
ReflowComments: true | ||
SortIncludes: true | ||
SortUsingDeclarations: true | ||
SpaceAfterCStyleCast: false | ||
SpaceAfterLogicalNot: false | ||
SpaceAfterTemplateKeyword: true | ||
SpaceBeforeAssignmentOperators: true | ||
SpaceBeforeCpp11BracedList: false | ||
SpaceBeforeCtorInitializerColon: true | ||
SpaceBeforeInheritanceColon: true | ||
SpaceBeforeParens: ControlStatements | ||
SpaceBeforeRangeBasedForLoopColon: true | ||
SpaceInEmptyBlock: false | ||
SpaceInEmptyParentheses: false | ||
SpacesBeforeTrailingComments: 2 | ||
SpacesInAngles: false | ||
SpacesInConditionalStatement: false | ||
SpacesInContainerLiterals: true | ||
SpacesInCStyleCastParentheses: false | ||
SpacesInParentheses: false | ||
SpacesInSquareBrackets: false | ||
SpaceBeforeSquareBrackets: false | ||
Standard: Auto | ||
StatementMacros: | ||
- Q_UNUSED | ||
- QT_REQUIRE_VERSION | ||
TabWidth: 8 | ||
UseCRLF: false | ||
UseTab: Never | ||
... |
This file contains 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 |
---|---|---|
@@ -1,6 +1,36 @@ | ||
#ifndef CANN_ACLNN_OPS | ||
#define CANN_ACLNN_OPS | ||
|
||
/** | ||
* @file acl_tensor | ||
* @brief This file contains related functions of ggml_tensor and acl_tensor. | ||
* Contains conversion from ggml_tensor to acl_tensor, broadcast and other | ||
* functions. | ||
* @author hipudding <[email protected]> | ||
* @author wangshuai09 <[email protected]> | ||
* @date July 15, 2024 | ||
* | ||
* Copyright (c) 2023-2024 The ggml authors | ||
* | ||
* Permission is hereby granted, free of charge, to any person obtaining a copy | ||
* of this software and associated documentation files (the "Software"), to | ||
* deal in the Software without restriction, including without limitation the | ||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||
* sell copies of the Software, and to permit persons to whom the Software is | ||
* furnished to do so, subject to the following conditions: | ||
* | ||
* The above copyright notice and this permission notice shall be included in | ||
* all copies or substantial portions of the Software. | ||
* | ||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
* IN THE SOFTWARE. | ||
*/ | ||
|
||
#include <aclnnop/aclnn_add.h> | ||
#include <aclnnop/aclnn_arange.h> | ||
#include <aclnnop/aclnn_argsort.h> | ||
|
@@ -18,26 +48,194 @@ | |
#include "acl_tensor.h" | ||
#include "common.h" | ||
|
||
/** | ||
* @brief Repeats a ggml tensor along each dimension to match the dimensions | ||
* of another tensor. | ||
* | ||
* @details This function repeats the elements of a source ggml tensor along | ||
* each dimension to create a destination tensor with the specified | ||
* dimensions. The operation is performed using the ACL backend and | ||
* executed asynchronously on the device. | ||
* | ||
* @param ctx The CANN context used for operations. | ||
* @param dst The ggml tensor representing the destination, which op is | ||
* GGML_OP_REPEAT and specifies the desired dimensions. | ||
*/ | ||
void ggml_cann_repeat(ggml_backend_cann_context& ctx, ggml_tensor* dst); | ||
|
||
/** | ||
* @brief Adds two ggml tensors using the CANN backend. | ||
* | ||
* @details This function performs an element-wise addition of two tensors. In | ||
* case the tensors do not have the same shape, one or both tensors | ||
* will be broadcasted to match the shape of the other before the | ||
* addition is performed.The formula for the operation is given by: | ||
* \f[ | ||
* \text{dst} = \text{acl_src0} + \alpha \cdot \text{acl_src1} | ||
* \f] | ||
* | ||
* @param ctx The CANN context used for operations. | ||
* @param dst The ggml tensor representing the destination, result of the | ||
* addition is stored at dst->data, and dst->op is GGML_OP_ADD | ||
*/ | ||
void ggml_cann_add(ggml_backend_cann_context& ctx, ggml_tensor* dst); | ||
|
||
/** | ||
* @brief Applies the Leaky ReLU activation function to a tensor using the CANN | ||
* backend. | ||
* | ||
* @details This function computes the Leaky ReLU activation for each element of | ||
* the input tensor. The Leaky ReLU function allows a small gradient | ||
* when the unit is not active (i.e., when the input is negative). The | ||
* Leaky ReLU function is defined as: | ||
* \f[ | ||
* \text{dst} = \max(0, src) + \text{negativeSlope} \cdot \min(0, | ||
* src) | ||
* \f] | ||
* | ||
* @param ctx The CANN context used for operations. | ||
* @param dst The destination tensor where the result of the Leaky ReLU | ||
* activation is stored, which op is GGML_OP_LEAKY_RELU | ||
*/ | ||
void ggml_cann_leaky_relu(ggml_backend_cann_context& ctx, ggml_tensor* dst); | ||
|
||
/** | ||
* @brief Concatenates multiple tensors along a specified dimension using the | ||
* CANN backend. | ||
* | ||
* @param ctx The CANN context used for operations. | ||
* @param tensorList A pointer to the list of tensors to be concatenated. | ||
* @param dst The destination tensor where the result of the | ||
* concatenation is stored. dst->op is GGML_OP_CONCAT. | ||
* @param concat_dim The dimension along which the tensors are concatenated. | ||
* | ||
* @attention tensorList length should be 2 and the dimension using for concat | ||
* default to 1. | ||
*/ | ||
void ggml_cann_concat(ggml_backend_cann_context& ctx, ggml_tensor* dst); | ||
|
||
/** | ||
* @brief Generates a sequence of evenly spaced values within a specified | ||
* interval for a ggml tensor using the CANN backend. | ||
* | ||
* @details This function creates a sequence of numbers over a specified i | ||
* nterval, starting from `start`, ending before `stop`, and | ||
* incrementing by `step`. The sequence is stored in the destination | ||
* tensor `dst`. | ||
* | ||
* @param ctx The CANN context used for operations. | ||
* @param dst The destination tensor where the generated sequence will be stored. | ||
* `start`, 'stop' and 'step' are in dst->op_params and dst->op is | ||
* GGML_OP_ARANGE | ||
*/ | ||
void ggml_cann_arange(ggml_backend_cann_context& ctx, ggml_tensor* dst); | ||
|
||
/** | ||
* @brief Computes the square of the elements of a ggml tensor using the CANN | ||
* backend. | ||
* @details The function sets the second source tensor of the destination | ||
* tensor `dst` to be equal to the first source tensor. This is | ||
* effectively squaring the elements since the multiplication becomes | ||
* `element * element`. | ||
* @param ctx The CANN context used for operations. | ||
* @param dst The destination tensor where the squared values will be stored, | ||
* which dst->op is GGML_OP_SQR | ||
*/ | ||
void ggml_cann_sqr(ggml_backend_cann_context& ctx, ggml_tensor* dst); | ||
|
||
/** | ||
* @brief Applies a clamp operation to the elements of a ggml tensor using the | ||
* CANN backend. | ||
* | ||
* @details This function clamps the elements of the input tensor `src` to a | ||
* specified range defined by `min` and `max` values. The result is | ||
* stored in the destination tensor `dst`. The operation is defined as: | ||
* \f[ | ||
* y = \max(\min(x, max\_value), min\_value) | ||
* \f] | ||
* where `x` is an element of the input tensor, and `y` is the | ||
* corresponding element in the output tensor. | ||
* @param ctx The CANN context used for operations. | ||
* @param dst The destination tensor where the clamped values will be stored. | ||
* dst->op is GGML_OP_CLAMP, `min` and `max` value is in dst->params. | ||
*/ | ||
void ggml_cann_clamp(ggml_backend_cann_context& ctx, ggml_tensor* dst); | ||
|
||
/** | ||
* @brief Scales the elements of a ggml tensor by a constant factor using the | ||
* CANN backend. | ||
* | ||
* @details This function multiplies each element of the input tensor `src` by | ||
* a scaling factor `scale`, storing the result in the destination | ||
* tensor `dst`. The operation is defined as: | ||
* \f[ | ||
* dst = src \times scale | ||
* \f] | ||
* | ||
* @param ctx The CANN context used for operations. | ||
* @param dst The destination tensor where the scaled values will be stored. | ||
* dst->op is GGML_OP_SCALE and scale value is in dst->params. | ||
*/ | ||
void ggml_cann_scale(ggml_backend_cann_context& ctx, ggml_tensor* dst); | ||
|
||
/** | ||
* @brief Sorts the elements of a ggml tensor and returns the indices that | ||
* would sort the tensor using the CANN backend. | ||
* | ||
* @details This function performs an argsort operation on the input tensor | ||
* `src`. It sorts the elements of `src` in either ascending or | ||
* descending order, depending on the `GGML_SORT_ORDER_DESC`, | ||
* and returns the indices that would sort the original tensor. | ||
* | ||
* @param ctx The CANN context used for operations. | ||
* @param dst The destination tensor where the sorted indices will be stored. | ||
* dst->op is ARGSORT | ||
*/ | ||
void ggml_cann_argsort(ggml_backend_cann_context& ctx, ggml_tensor* dst); | ||
|
||
/** | ||
* @brief Computes the Layer Normalization for a ggml tensor using the CANN | ||
* backend. | ||
* | ||
* @details This function applies the Layer Normalization operation on the | ||
* input tensor `src` and stores the result in the destination tensor | ||
* `dst`. Layer Normalization normalizes the features at each sample in | ||
* a mini-batch independently. It is commonly used in neural networks | ||
* to normalize the activations of a layer by adjusting and scaling | ||
* the outputs. The operation is defined as: | ||
* \f[ | ||
* \text { out }=\frac{x-\mathrm{E}[x]}{\sqrt{\operatorname{Var}[x]+eps}} | ||
* \f], Var is default dst->ne[0]. eps is dst->params. | ||
* | ||
* @param ctx The CANN context used for operations. | ||
* @param dst The destination tensor where the normalized values will be stored. | ||
*/ | ||
void ggml_cann_norm(ggml_backend_cann_context& ctx, ggml_tensor* dst); | ||
|
||
/** | ||
* @brief Computes the Group Normalization for a ggml tensor using the CANN | ||
* backend. | ||
* | ||
* @brief This function applies the Group Normalization operation on the input | ||
* tensor `src` and stores the result in the destination tensor `dst`. | ||
* Group Normalization divides the channels into groups and normalizes | ||
* the features within each group across spatial locations. | ||
* It is commonly used in convolutional neural networks to improve | ||
* training stability and performance. | ||
* | ||
* @details | ||
* The function first creates ACL tensors from the ggml tensors `src` and `dst`. It then defines the epsilon value (`eps`) | ||
* and the number of groups (`n_groups`) for normalization. Variables for workspace allocation are initialized. The | ||
* function calculates the workspace size required for the Group Normalization operation using the | ||
* `aclnnGroupNormGetWorkspaceSize` function. If a workspace is needed, it allocates memory using the ggml pool allocator. | ||
* Temporary tensors `acl_mean_out` and `acl_rstd_out` are created for intermediate results. The Group Normalization | ||
* operation is executed using the `aclnnGroupNorm` function. Finally, the allocated resources are released. | ||
* | ||
* @param ctx The CANN context used for operations. | ||
* @param dst The destination tensor where the normalized values will be stored. | ||
* | ||
* @attention eps defaults to 1e-6f | ||
*/ | ||
void ggml_cann_group_norm(ggml_backend_cann_context& ctx, ggml_tensor* dst); | ||
|
||
void ggml_cann_softmax(ggml_backend_cann_context& ctx, ggml_tensor* dst); | ||
|